【拜小白opencv】15-利用ROI将一幅图像叠加到另一幅图像的指定位置

来源:互联网 发布:autodesk 打印 软件 编辑:程序博客网 时间:2024/05/24 00:32

常言道“温故而知新”,写此文章就是对自己目前学习内容的小小的总结与记录。

本文力求用最简洁的语言,详细的代码将此部分内容讲解清楚,但由于博主同样是刚刚接触OpenCV,或许表达上有些瑕疵,还望读者能够指教探讨,大家共同进步。

博主机器配置为:VS2013+opencv2.4.13+Win-64bit。

若本文能给读者带来一点点启示与帮助,我就很开心了。

===========================分割线========================


如何利用ROI获取图像,请看【拜小白opencv】8-感兴趣区域ROI图像获取操作

本节将利用ROI将一幅图像叠加到另一幅图像的指定位置。

具体过程见下面代码


=======================分割线========================

代码演示

/*利用ROI将一幅图像叠加到另一幅图像的指定位置*/#include <opencv2/core/core.hpp>    #include <opencv2/highgui/highgui.hpp>    #include <opencv2/imgproc/imgproc.hpp>   #include <iostream>  using namespace std;using namespace cv;int main(){//【1】读入两幅图像并检查图像是否读取成功  Mat srcImage = imread("D:\\OutPutResult\\ImageTest\\dog1.jpg");Mat signal = imread("D:\\OutPutResult\\ImageTest\\signal.jpg");if (!srcImage.data || !signal.data){cout << "读取图像有误,请重新输入正确路径!\n";return false;}imshow("【萌宠】", srcImage);imshow("【信号】", signal);//【2】定义一个Mat类型并给其设定ROI区域Mat imageROI = srcImage(Rect(450, 20, signal.cols, signal.rows));//450,20为自定义起始点坐标//【3】加载掩模(必须是灰度图)Mat mask = imread("D:\\OutPutResult\\ImageTest\\signal.jpg", 0);//参数0显示为灰度图//【4】将掩模复制到ROIsignal.copyTo(imageROI, mask);//【5】显示结果namedWindow("利用ROI实现图像叠加");imshow("利用ROI实现图像叠加", srcImage);waitKey(0);return 0;}

==========================分割线============================

显示结果


=========================分割线======================

程序说明

我们会看到程序里有这么一行代码
signal.copyTo(imageROI, mask);

括号里,第一个参数表示为输出图像,第二参数表示为掩码(or掩模)。
我们也可以将这部分内容这么改,见下图:



改后的就不带mask参数,其结果显示都是一样的,那么如何理解带mask参数的这种方式呢?
答:对于形如函数srcImage.copyto(dstImage, mask),mask作为一个掩模板。
函数会检测mask中如果在某个像素点(i, j)其值为1(只看第一通道,所以mask单通道即可)则把srcImage.at(i, j)处的值直接赋给dstImage.at(i, j);如果其值为0则dstImage.at(i, j)处保留其原始像素值。

===============================END============================

原创粉丝点击