OpenCV利用感兴趣的区域进行图像叠加

一、先看效果图:

方法一是直接叠加,方法二利用图像掩膜叠加。

二、代码:

#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。

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章