定義ROI區域有兩種方法:
第一種:使用表示矩形區域的Rect。指定矩形的左上角座標(構造函數的前兩個參數)和矩形的長寬(構造函數的後兩個參數)。
imageROI = image(Rect(500, 250, logo.cols, logo.rows));
第二種:指定感興趣行或列的範圍(Range)。Range是從起始索引到終止索引(不包括終止索引)的一連續序列。CRange可以用來定義Range。
imageROI = image(Range(250, 250+logoImage.rows), Range(200, 200+logoImage.cols));
下邊用一個例子來說明ROI的用法。例子是利用ROI將一幅圖加到另一幅圖的指定位置。
#include <opencv2/core/core.hpp>
#include <opencv2/highgui/highgui.hpp>
#include <iostream>
using namespace cv;
using namespace std;
void main(){
//讀入圖像並顯示圖像
Mat srcImage = imread("dota_pa.jpg");
Mat logoImage = imread("dota_logo.jpg");
if (!srcImage.data)
cout << "讀取srcImage錯誤!" << endl;
imshow("dota_pa原始圖", srcImage);
if (!logoImage.data)
cout << "讀取logoImage錯誤!"<< endl;
imshow("dota_logo原始圖",logoImage);
//定義一個Mat類型並給其設定ROI區域
Mat imageROI = srcImage(Rect((srcImage.cols - logoImage.cols),
(srcImage.rows - logoImage.rows), logoImage.cols, logoImage.rows));
//加載掩模板(灰度圖就可以)
Mat mask = imread("dota_logo.jpg", 0);
//將掩膜複製到ROI
logoImage.copyTo(imageROI, mask);
//顯示結果
namedWindow("<1>利用ROI實現圖像疊加實例窗口");
imshow("<1>利用ROI實現圖像疊加實例窗口", srcImage);
waitKey(0);
}
運行結果:
上述代碼關於copyTo函數的用法,可參考博文OpenCV中copyTo()函數及Mask詳解(附代碼詳解)