#include<iostream>
#include<opencv2/core.hpp>
#include<opencv2/highgui.hpp>
#include<opencv2/imgproc.hpp>
using namespace std;
using namespace cv;
int main() {
Mat image = imread("lena.jpg");
Mat logo = imread("logo.jpg");
Mat Roi_image(image, Rect(image.cols - logo.cols, image.rows - logo.rows, logo.cols, logo.rows));
logo.copyTo(Roi_image);
imshow("image", image);
waitKey();
return 0;
}
定義 ROI 的一種方法是使用 cv::Rect 實例。正如其名,它通過指明左上角的位置(構造函數的前兩個參數)和矩形的尺寸(後兩個參數表示寬度和高度),描述了一個矩形區域。在這個例子中,我們利用圖像和標誌的尺寸來確定標誌的位置,即圖像的右下角。很明顯,整個 ROI肯定處於父圖像的內部。
ROI 還可以用行和列的值域來描述。值域是一個從開始索引到結束索引的連續序列(不含開始值和結束值),可以用 cv::Range 結構來表示這個概念。因此,一個 ROI 可以用兩個值域來定義。
imageROI= image(cv::Range(image.rows-logo.rows,image.rows),cv::Range(image.cols-logo.cols,image.cols));
使用圖像掩碼
OpenCV 中的有些操作可以用來定義掩碼。函數或方法通常對圖像中所有的像素進行操作,通過定義掩碼可以限制這些函數或方法的作用範圍。掩碼是一個 8 位圖像,如果掩碼中某個位置的值不爲 0,在這個位置上的操作就會起作用;如果掩碼中某些像素位置的值爲 0,那麼對圖像中相應位置的操作將不起作用。例如,在調用 copyTo 方法時就可以使用掩碼,我們可以利用掩碼只複製標誌中白色的部分,如下所示
#include<iostream>
#include<opencv2/core.hpp>
#include<opencv2/highgui.hpp>
#include<opencv2/imgproc.hpp>
using namespace std;
using namespace cv;
extern void onMouse(int event, int x, int y, int flags, void* param);
int main() {
Mat image = imread("lena.jpg");
Mat logo = imread("logo.jpg");
Mat logob = imread("logob.jpg");
cout << logo.size() << endl;
Mat Roi_image(image, Rect(image.cols - logo.cols, image.rows - logo.rows, logo.cols, logo.rows));
Mat logoc = logo - logob;
Mat mask(logoc);
imshow("logoc",logoc);
logo.copyTo(Roi_image,mask);
imshow("image", image);
imwrite("lenalogo.jpg",image);
setMouseCallback("image", onMouse, reinterpret_cast<void*>(&image));
waitKey();
return 0;
}