一、先看效果图:
方法一是直接叠加,方法二利用图像掩膜叠加。
二、代码:
#include <opencv2/opencv.hpp>
#include <opencv2/core/core.hpp>
#include <opencv2/highgui/highgui.hpp>
#include <opencv2/imgproc/imgproc.hpp>
#include <iostream>
using namespace cv;
bool ROI_AddImage1(); //利用感兴趣区域直接叠加图像
bool ROI_AddImage2(); //利用感兴趣区域和图像掩膜(mask)叠加图像
int main()
{
//=====利用方法1混合图像
bool result1 = ROI_AddImage1();
if (result1)
{
std::cout << "1图像混合成功1" << std::endl;
}
//=====利用方法2混合图像
bool result2 = ROI_AddImage2();
if (result2)
{
std::cout << "2图像混合成功2" << std::endl;
}
waitKey(0);
return 0;
}
//=======ROI_AddImage1()函数
//利用感兴趣区域直接叠加图像
bool ROI_AddImage1()
{
//<1>读入主图片----------------------------------------
Mat src_Image = imread("F:\\TuPian\\dota_src.jpg");
if (src_Image.data == NULL)
{
std::cout << "读取图片src_Image错误" << std::endl;
}
//<2>读入logo-----------------------------------------
Mat logo_Image = imread("F:\\TuPian\\dota_logo.jpg");
if (logo_Image.data == NULL)
{
std::cout << "读取图片logo_Image错误" << std::endl;
}
//<3>在主图片上面定义“感兴趣”的区域----------------------
Mat ROI_image = src_Image(Rect(200, 250, logo_Image.cols, logo_Image.rows));
//Mat ROI_image = src_Image(Range(200,200+logo_Image.rows),Range(200,200+logo_Image.cols));
//<4>将logo复制到“感兴趣”的区域-------------------------
logo_Image.copyTo(ROI_image);
//<5>显示图片------------------------------------------
imshow("1图像混合方法1", src_Image);
return true;
}
//=======ROI_AddImage2()函数
//利用感兴趣区域和图像掩膜(mask)叠加图像
bool ROI_AddImage2()
{
//<1>读入主图片----------------------------------------
Mat src_Image = imread("F:\\TuPian\\dota_pa.jpg");
if (src_Image.data == NULL)
{
std::cout << "读取图片src_Image错误" << std::endl;
}
//<2>读入logo-----------------------------------------
Mat logo_Image = imread("F:\\TuPian\\dota_logo.jpg");
if (logo_Image.data == NULL)
{
std::cout << "读取图片logo_Image错误" << std::endl;
}
//<3>在主图片上面定义“感兴趣”的区域----------------------
Mat ROI_image = src_Image(Rect(200, 250, logo_Image.cols, logo_Image.rows));
//Mat ROI_image = src_Image(Range(200,200+logo_Image.rows),Range(200,200+logo_Image.cols));
//<4>加载图像掩膜(必须是灰度图)------------------------
Mat mask = imread("F:\\TuPian\\dota_logo.jpg", 0); //参数0表示将图像转为灰度图,默认1是彩色图
//<5>将掩膜复制到“感兴趣”的区域--------------------------
logo_Image.copyTo(ROI_image, mask);
//<6>显示图片------------------------------------------
imshow("2图像混合方法2", src_Image);
return true;
}
参考:
https://blog.csdn.net/xierhacker/article/details/52493746
毛星云、冷雪飞等编著,电子工业出版社,2018年11月第19次印刷,p115-116。