OpenCV之图像混合

先上代码

#include <iostream>
#include <opencv2/core.hpp>
#include <opencv2/highgui.hpp>
#include <opencv2/imgproc.hpp>
#include <opencv2/videoio.hpp>
#include <opencv2/video.hpp>

using namespace cv;
using namespace std;

bool ROI_AddImage();
bool LinearBlending();
bool ROI_LinearBlending();

int main(int argc, char** argv)
{
	//system("color 5E");
	if (ROI_AddImage() && LinearBlending() && ROI_LinearBlending())
	{
		cout << endl << "运行成功,得到了想要的图像";
	}
	ROI_AddImage();
	waitKey(0);
	return 0;
}

bool ROI_AddImage() {
	//利用感兴趣区域ROI实现图像叠加
	//1.读入图像
	Mat srcImage1 = imread("erha.jpg");
	Mat logoImage = imread("logo.png");
	if (!srcImage1.data)
	{
		cout << "读入srcImage1错误" << endl;
		return false;
	}
	if (!logoImage.data)
	{
		cout << "读入logoImage错误" << endl;
		return false;
	}
	//2.定义一个Mat类型并给其设定ROI区域
	Mat imageROI = srcImage1(Rect(200, 250, logoImage.cols, logoImage.rows));

	//3.加载掩膜 必须是灰度图
	Mat mask = imread("logo.png", 0);
	//4.将掩膜赋值到ROI
	logoImage.copyTo(imageROI, mask);

	//5.显示结果
	namedWindow("用ROI实现叠加窗口");
	imshow("用ROI实现叠加窗口", srcImage1);
	return true;
}

bool LinearBlending() {
	//用addweight函数实现图像线性混合
	Mat srcImage2, srcImage3, dstImage;
	//读取图像
	srcImage2 = imread("3.jpg");
	srcImage3 = imread("4.jpg");
	addWeighted(srcImage2, 0.5, srcImage3, 0.5, 0.0, dstImage);
	//创建并显示窗口
	namedWindow("线性混合窗口原图");
	imshow("线性混合窗口原图", srcImage2);
	namedWindow("线性混合窗口效果图");
	imshow("线性混合窗口效果图", dstImage);
	return true;
}

bool ROI_LinearBlending() {
	Mat srcImage, logoImage;
	srcImage = imread("erha.jpg");
	logoImage = imread("logo.png");

	Mat imageROI = srcImage(Range(250, 250 + logoImage.rows), Range(200, 200 + logoImage.cols));
	//将logo加到原图上
	addWeighted(imageROI, 0.5, logoImage, 0.5, 0.0, imageROI);

	//显示结果
	namedWindow("区域线性图像混合");
	imshow("区域线性图像混合", srcImage);

	return true;
}

效果

解析

今天也是对之前学习的一些总结

ROI_AddImage函数是利用感兴趣区域ROI实现图像的叠加

LinearBlending函数是利用addweight函数对图像进行线性混合

ROI_LinearBlending函数在利用感兴趣区域ROI对图像进行线性混合

可能唯一有疑惑的就是ROI_LinearBlending函数为什么输出的感兴趣区域的矩阵,为什么显示原图时,原图会发生变化:Mat在初始化的时候,只有Copyto函数和clone函数才会真正的把数据拷贝出来一份,其他赋值只会复制指针区域,也就是说我们只是拷贝了一份指向相同位置的指针,修改的还是同一份数据。

对了,还有点奇怪为什么掩膜必须是灰度图,后面再看看,再转回来解决这个疑问把。

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值