#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;
}