一、先看效果圖:
方法一是直接疊加,方法二利用圖像掩膜疊加。
二、代碼:
#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。