opencv ROi区域图像叠加

本文主要是对一张图片中的感兴趣区域ROI进行叠加
定义ROI区域的方法有两种
(1 )使用Rect()函数
opencv ROi区域图像叠加
Rect里面的四个参数分别是矩形左上角的横、纵坐标,矩形的长。宽。
(2)使用Range()函数
opencv ROi区域图像叠加
我们可以通过一个图像掩膜(mask),直接将插入处的像素设置为logo图像的像素值,具体程序如下:
#include<opencv2/core/core.hpp>
#include<opencv2/highgui/highgui.hpp>
#include
using namespace cv;
using namespace std;
int main()
{
Mat image = imread(“3.jpg”);
Mat logo = imread(“4.jpg”);
if (!image.data || !logo.data)
{
cout << “读取图像有误,请重新读入正确途径!” << endl;
return false;
}
imshow(“haha”, image);
imshow(“xixi”, logo);
Mat imageROI;
imageROI = image(Rect(30, 30, logo.cols, logo.rows));
Mat mask = imread(“4.jpg”,0);
logo.copyTo(imageROI, mask);
namedWindow(“原图+logo”);
imshow(“原图+logo”, image);
imwrite(“由imwrite生成的图片.jpg”, image);
waitKey(0);
return 0;
}

结果如下:
opencv ROi区域图像叠加
可以通过修改rect()函数里面左上角左边来调整里面logo的大小,
opencv ROi区域图像叠加
除此之外我们可以通过addWeighted函数来进行图像混合操作,具体代码如下(只需改一两条语句):

Mat imageROI;
imageROI = image(Rect(30, 700, logo.cols, logo.rows));
addWeighted(imageROI, 0.5, logo, 0.3, 0, imageROI);

结果如下:
opencv ROi区域图像叠加
opencv ROi区域图像叠加
明显可以看出,第二种方法更好的将logo融于原图中。

在运行的时候,也遇到过一个错误,

opencv ROi区域图像叠加
这主要是由于图片插入的位置超过了原图的大小,只要调整logo的左上角的点的坐标即可。

上述程序借鉴参考书《OpenCV3编程入门》。