#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,改变它,目标图像就会发生变化。