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。

 

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