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;
}

Effect

Parse

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

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

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

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

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

顺便说一句,为什么蒙版一定是灰度图还是有点奇怪。稍后我会查看它并返回以解决这个问题。

文章出处登录后可见!

已经登录?立即刷新

共计人评分,平均

到目前为止还没有投票!成为第一位评论此文章。

(0)
社会演员多的头像社会演员多普通用户
上一篇 2022年4月27日
下一篇 2022年4月27日

相关推荐