《OpenCV3程式設計入門》——5.2.4 初級影象混合
阿新 • • 發佈:2018-12-04
本文是將設定感興趣區域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原始圖 |
線性混合示例效果圖 |