【opencv入門之二】感興趣區域ROI,線性混合addWeighted
阿新 • • 發佈:2017-09-18
bsp enc 擁有 ted 興趣 通道數 amp log 兩個
參考網站:
http://blog.csdn.net/poem_qianmo/article/details/20911629
1、感興趣區域ROI
//【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 );
2、addWeighted函數
其原型:
void addWeighted(InputArray src1, double alpha, InputArray src2, double beta, double gamma, OutputArray dst, int dtype=-1);
第一個參數:InputArray類型的src1,表示需要加權的第一個數組,常常填一個Mat
第二個參數:alpha,表示第一個數組的權重
第三個參數:src,表示需要第二個數組,它需要和第一個數組擁有相同的尺寸和通道數
第四個參數:beta,表示第二個數組的權重
第五個參數:gamma,一個加到權重總和上的標量值。????不是很懂
第六個參數:dst,輸出的數組,它和輸入的兩個數組擁有相同的尺寸和通道數。
第七個參數:dtype,輸出陣列的課選深度,有默認值-1.??????不懂
//【2】進行圖像混合加權操作 betaBValue = (1.0 - aphaValue); addWeighted( srcImage2, aphaValue, srcImage3, betaBValue, 0.0, dstImage);
3、綜合:
#include <cv.h> #include <highgui.h> #include <iostream> //*************************【命名空間聲明部分】********************************** //描述:包含程序所使用的命名空間 //******************************************************************************* using namespace cv; using namespace std; //cout的命名空間??? //*************************【全局函數聲明部分】********************************** //描述:全局函數聲明 //******************************************************************************* bool ROI_AddImage(); bool LinearBlending(); bool ROI_LinearBlending(); //*************************【main()函數】********************************** //描述:控制臺應用程序的入口函數,我們的程序從這裏開始 //******************************************************************************* int main() { system("color 5E"); if (ROI_AddImage() && LinearBlending() && ROI_LinearBlending()) cout<<endl<<"嗯,非常gut。得出了你需要的圖像了。!!!"; 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) { printf("damm,讀取文件srcImage1錯誤~!\n"); return false; } if (!logoImage.data) { printf("damm,讀取文件logoImage錯誤~!\n"); return false; } //【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】顯示結果 namedWindow( " <1>利用ROI實現圖像疊加示例窗口 " ); imshow( " <1>利用ROI實現圖像疊加示例窗口 ",srcImage1 ); return true; } //*************************【LinearBlending()函數】************************************ //函數名:LinearBlending() //描述 :利用cv::addWeighted()函數實現圖像線性混合 //************************************************************************************ bool LinearBlending() { //【0】定義一些局部變量 double aphaValue = 0.5; double betaBValue; Mat srcImage2,srcImage3,dstImage; //【1】讀取圖像(兩幅圖片需要同樣的類型和尺寸) srcImage2 = imread("mogu.jpg"); srcImage3 = imread("rain.jpg"); if (!srcImage2.data) { printf("damm,讀取文件srcImage2錯誤~!\n"); return false; } if (!srcImage3.data) { printf("damm,讀取文件srcImage3錯誤~!\n"); return false; } //【2】進行圖像混合加權操作 betaBValue = (1.0 - aphaValue); addWeighted( srcImage2, aphaValue, srcImage3, betaBValue, 0.0, dstImage); //【3】創建並顯示原圖窗口 namedWindow( "<2>線性混合示例窗口【原圖】" , 1); imshow( "<2>線性混合示例窗口【原圖】", srcImage2 ); namedWindow( "<3>線性混合示例窗口【效果圖】" , 1); imshow( "<3>線性混合示例窗口【效果圖】", srcImage3 ); namedWindow( "<4>線性混合示例窗口【效果圖】" , 1); imshow( "<4>線性混合示例窗口【效果圖】", dstImage ); return true; } //*************************【ROI_LinearBlending()函數】********************************** //函數名:ROI_LinearBlending() //描述 :線性混合實現函數,指定區域線性圖像線性混合 // 利用cv::addWeighted()函數結合定義感興趣區域ROI,實現自定義區域的線性混合 //*************************************************************************************** bool ROI_LinearBlending() { //【1】讀取圖像 Mat srcImage4 = imread("dota_pa.jpg"); Mat logoImage = imread("dota_logo.jpg"); if (!srcImage4.data) { printf("damm,讀取文件srcImage4錯誤~!\n"); return false; } if (!logoImage.data) { printf("damm,讀取文件logoImage錯誤~!\n"); return false; } //【2】定義一個Mat類型並給其設定ROI區域 //第一種表達 Mat imageROI = srcImage4( Rect(200, 250, logoImage.cols, logoImage.rows) ); //第二種表達 //Mat imageROI = srcImage4( Range(250, 250+logoImage.rows), Range(200, 200+logoImage.cols) ); //【3】將logo加到原圖上 addWeighted(imageROI, 0.5, logoImage, 0.3, 0.0, imageROI); //【4】顯示結果 namedWindow("<5>區域線性圖像混合示例窗口", 1); imshow("<5>區域線性圖像混合示例窗口", srcImage4); return true; }
【opencv入門之二】感興趣區域ROI,線性混合addWeighted