#include<opencv2/core/core.hpp>
#include<opencv2/highgui/highgui.hpp>
#include<iostream>
using namespace cv;
using namespace std;
//图像添加
bool ROI_AddImage()
{
Mat srcImage1 = imread("2.jpg");
Mat logoImage = imread("logo1.jpg");
if (!srcImage1.data)
{
printf( "读取srcimgae1错误\n");
return false;
}
if (!logoImage.data)
{
printf("读取logoImage错误\n");
return false;
}
//设置ROI区域
Mat imageROI = srcImage1(Rect(2, 2, logoImage.cols, logoImage.rows));
//加载掩膜,必须为灰度图
Mat mask = imread("logo1.jpg", 0);
//掩膜复制到ROI
logoImage.copyTo(imageROI, mask);
namedWindow("<1>利用ROI实现图像叠加示例");
imshow("<1>利用ROI实现图像叠加示例", srcImage1);
waitKey(0);
return true;
}
//线性混合
bool LinearBlending()
{
double alphaValue = 0.5;
double betaValue = 1 - alphaValue;
Mat srcImage2, srcImage3, dstImage;
srcImage2 = imread("3.jpg");
srcImage3 = imread("5.jpg");
if (!srcImage2.data)
{
cout << "读取srcImage2失败\n";
return true;
}if (!srcImage3.data)
{
cout << "读取srcImage3失败\n";
return true;
}
addWeighted(srcImage2, alphaValue, srcImage3, betaValue, 0.0, dstImage);
namedWindow("<2>线性混合示例窗口原图1",1);
imshow("<2>线性混合示例窗口原图1", srcImage2);
namedWindow("<2>线性混合示例窗口原图2", 1);
imshow("<2>线性混合示例窗口原图2", srcImage3);
namedWindow("<2>线性混合示例窗口效果图", 1);
imshow("<2>线性混合示例窗口效果图", dstImage);
waitKey(0);
return true;
}
//图像添加+线性混合
bool ROI_LinearBlending()
{
//两幅图片一定要尺寸相同,不然多余的部分无法混合
Mat srcImage4 = imread("5.jpg");
Mat logoImage = imread("logo1.jpg");
if (!srcImage4.data)
{
cout << "读取srcImage4失败!\n";
return false;
}
if (!logoImage.data)
{
cout << "读取logoImage失败!\n";
return false;
}
Mat imageROI;
imageROI = srcImage4(Rect(200, 250, logoImage.cols, logoImage.rows));
//imageROI = srcImage4(Range(250, 250 + logoImage.rows), Range(200, 200 + logoImage.cols));
addWeighted(imageROI, 0.5, logoImage, 0.3, 0., imageROI);
namedWindow("<4>区域线性图像混合示例窗口");
imshow("<4>区域线性图像混合示例窗口", srcImage4);
waitKey(0);
return true;
}
int main()
{
if (ROI_AddImage())
{
printf("叠加成功");
}
if (LinearBlending())
{
printf("混合成功\n");
}
if (ROI_LinearBlending())
{
printf("区域线性混合成功\n");
}
}
效果图:
图像叠加:
图像线性混合:
图像叠加+线性混合
对于图像叠加+线性混合,首先imageROI = srcImage4(Rect(200, 250, logoImage.cols, logoImage.rows));截取原图中的一部分即imageROI,然后addWeighted(imageROI, 0.5, logoImage, 0.3, 0., imageROI);将截取的部分和logo线性混合,再存入imageROI,所以最后结果如图。
对于第一种只叠加的,需要把logo加载为灰度图,即imread的第二个参数为0.
疑问:addWeighted函数为什么不出现目标图像?
答:截取了目标图像的一部分即imageROI,改变它,目标图像就会发生变化。