本文是將設置感興趣區域ROI和使用addWeighted函數進行圖像線性混合結合起來使用,下邊是具體的代碼示例:
#include <opencv2/core/core.hpp>
#include <opencv2/highgui/highgui.hpp>
#include <iostream>
using namespace cv;
using namespace std;
//-----------------------------------【全局函數聲明部分】--------------------------------------
// 描述:全局函數聲明
//-----------------------------------------------------------------------------------------------
bool ROI_AddImage();
bool LinearBlending();
bool ROI_LinearBlending();
//-----------------------------------【main( )函數】--------------------------------------------
// 描述:控制檯應用程序的入口函數,我們的程序從這裏開始
//-----------------------------------------------------------------------------------------------
int main()
{
system("color 6F");
if (ROI_AddImage() && LinearBlending() && ROI_LinearBlending())
{
cout << endl << "\n運行成功,得出了需要的圖像";
}
waitKey(0);
return 0;
}
//----------------------------------【ROI_AddImage( )函數】----------------------------------
// 函數名:ROI_AddImage()
// 描述:利用感興趣區域ROI實現圖像疊加
//----------------------------------------------------------------------------------------------
bool ROI_AddImage()
{
// 【1】讀入圖像
Mat srcImage1 = imread("dota_pa.jpg");
Mat logoImage = imread("dota_logo.jpg");
if (!srcImage1.data) { cout << "讀取srcImage1錯誤~! \n" << endl; return false; }
if (!logoImage.data) { cout << "讀取logoImage錯誤~! \n" << endl; return false; }
imshow("dota_pa原始圖", srcImage1);
imshow("dota_logo原始圖", logoImage);
// 【2】定義一個Mat類型並給其設定ROI區域
Mat imageROI = srcImage1(Rect(200, 250, logoImage.cols, logoImage.rows));
// 【3】加載掩模(必須是灰度圖)
Mat mask = imread("dota_logo.jpg", 0);
//【4】將掩膜拷貝到ROI
logoImage.copyTo(imageROI, mask);
// 【5】顯示結果
imshow("<1>利用ROI實現圖像疊加示例窗口", srcImage1);
return true;
}
//---------------------------------【LinearBlending()函數】-------------------------------------
// 函數名:LinearBlending()
// 描述:利用cv::addWeighted()函數實現圖像線性混合
//--------------------------------------------------------------------------------------------
bool LinearBlending()
{
//【0】定義一些局部變量
double alphaValue = 0.6;
double betaValue;
Mat srcImage2, srcImage3, dstImage;
// 【1】讀取圖像 ( 兩幅圖片需爲同樣的類型和尺寸 )
srcImage2 = imread("mogu.jpg");
srcImage3 = imread("rain.jpg");
if (!srcImage2.data) { cout << "讀取srcImage2錯誤! \n" << endl; return false; }
if (!srcImage3.data) { cout << "讀取srcImage3錯誤! \n" << endl; return false; }
imshow("mogu原始圖", srcImage2);
imshow("rain原始圖", srcImage3);
// 【2】進行圖像混合加權操作
betaValue = (1.0 - alphaValue);
addWeighted(srcImage2, alphaValue, srcImage3, betaValue, 0.0, dstImage);
// 【3】顯示原圖窗口
imshow("<2>線性混合示例窗口【效果圖】", dstImage);
return true;
}
//---------------------------------【ROI_LinearBlending()】-------------------------------------
// 函數名:ROI_LinearBlending()
// 描述:線性混合實現函數,指定區域線性圖像混合.利用cv::addWeighted()函數結合定義
// 感興趣區域ROI,實現自定義區域的線性混合
//--------------------------------------------------------------------------------------------
bool ROI_LinearBlending()
{
//【0】定義一些局部變量
double alphaValue = 0.7;
double betaValue;
//【1】讀取圖像
Mat srcImage4 = imread("dota_pa.jpg", 1);
Mat logoImage = imread("dota_logo.jpg");
if (!srcImage4.data) { cout << "讀取srcImage4錯誤~! \n" << endl; return false; }
if (!logoImage.data) { cout << "讀取logoImage錯誤~! \n" << endl; return false; }
//【2】定義一個Mat類型並給其設定ROI區域
Mat imageROI;
//方法一
imageROI = srcImage4(Rect(200, 250, logoImage.cols, logoImage.rows));
//方法二
//imageROI= srcImage4(Range(250,250+logoImage.rows),Range(200,200+logoImage.cols));
//【3】將logo加到原圖上
betaValue = (1.0 - alphaValue);
addWeighted(imageROI, alphaValue, logoImage,betaValue, 0., imageROI);
//【4】顯示結果
imshow("<3>區域線性圖像混合示例窗口", srcImage4);
return true;
}
dota_pa原始圖 | dota_logo原始圖 |
利用ROI實現圖像疊加示例效果圖 | 區域線性圖像混合示例效果圖 |
mogu原始圖 | rain原始圖 |
線性混合示例效果圖 |