OpenCV3:圖片融合例程——addWeighted(),createTrackbar()函式使用
滑動條的建立和使用:
addWeighted(),createTrackbar()函式
//---------------------【滑動條的建立和使用】----------------------- #include "pch.h" //#include <iostream> #include <opencv2\opencv.hpp> #include <opencv2\highgui.hpp> #define WINDOW_NAME "【線性混合例項】" //為視窗標題定義得巨集 using namespace cv; //using namespace std; //【全域性變數宣告部分】 const int g_nMaxAlphaValue = 100;//Alpha值的最大值,為int型別 int g_nAlphaValueSlider;//滑動條對應的變數 double g_dAlphaValue; double g_dBetaValue; //【宣告儲存影象的變數】 Mat g_srcImage1; Mat g_srcImage2; Mat g_dstImage; //【on_Trackbar()函式】:相應滑動條的回撥函式 void on_Trackbar(int, void*) { //求出當前alpha值相對於最大值的比例 g_dAlphaValue = (double)g_nAlphaValueSlider / g_nMaxAlphaValue; //則beta值為1減去alpha值 g_dBetaValue = (1.0 - g_dAlphaValue); //根據alpha和beta的值進行線性混合 addWeighted(g_srcImage1, g_dAlphaValue, g_srcImage2, g_dBetaValue, 0.0, g_dstImage); //顯示效果圖 imshow(WINDOW_NAME, g_dstImage); } //-----------------------------【main()函式】-------------------------- // 控制檯應用程式的入口函式,我們的程式從這裡開始執行 //--------------------------------------------------------------------- int main(int argc,char** argv) { //載入影象(兩影象的尺寸需相同) g_srcImage1 = imread("lena.tif"); g_srcImage2 = imread("lenag.tif"); if (!g_srcImage1.data) { printf("讀取第一張圖片錯誤,請確定目錄下是否有imread函式指定圖片存在!\n"); return -1; } if (!g_srcImage2.data) { printf("讀取第二張圖片錯誤,請確定目錄下是否有imread函式指定圖片存在!\n"); return -1; } //設定滑動條的初始值為70 g_nAlphaValueSlider = 70; //建立窗體 namedWindow(WINDOW_NAME, 1); //在建立的窗體中建立一個滑動條的控制元件 char TrackbarName[50]; sprintf_s(TrackbarName, "透明值 %d", g_nMaxAlphaValue); createTrackbar(TrackbarName, WINDOW_NAME, &g_nAlphaValueSlider, g_nMaxAlphaValue, on_Trackbar); //結果在回撥函式中顯示 on_Trackbar(g_nAlphaValueSlider, 0); //按任意鍵退出 waitKey(0); return 0; }
這次介紹opencv中一個簡單的點運算函式,用來實現圖片合成。 對應於例程中的 (TUTORIAL) AddingImages 和 (TUTORIAL) AddingImagesTrackbar。
Opencv中提供的函式是addWeighted,用法很簡單
影象處理中一個簡單而有趣的點運算操作可以用以下的公式表示,可以實現兩張圖片的線性融合。 這裡α 表示兩種圖片的融合比例,這個g(x) 表示 融合圖片中的畫素點,f0(x) 和 f1(x) 分別表示背景和前景圖片中的畫素點。
addWeighted(g_srcImage1, g_dAlphaValue, g_srcImage2, g_dBetaValue, 0.0, g_dstImage);
opencv 通過 addWeighted 函式實現圖片的線性融合,這個函式在之前的例程中也有提到過。
這個函式的原型如下所示,可以看出這個函式最小需要6個引數。
1、 第1個引數,輸入圖片1,
2、第2個引數,圖片1的融合比例
3、第3個引數,輸入圖片2
4、第4個引數,圖片2的融合比例
5、第5個引數,偏差
6、第6個引數,輸出圖片
二、利用highgui庫中的 createTrackbar 函式建立一個滑塊,函式的原型如下
createTrackbar(TrackbarName, WINDOW_NAME, &g_nAlphaValueSlider, g_nMaxAlphaValue, on_Trackbar); int createTrackbar(const string& trackbarname, const string& winname, int* value, int count, TrackbarCallback onChange = 0, void* userdata = 0);
可以看到,這個函式有6個引數,最後一個為使用者資料的指標,類似回撥函式中的使用者資料指標。
1、第一個引數,為滑塊的名字
2、第二個引數,為滑塊所在視窗的名字,用來獲取視窗的handle
3、第三個引數,為傳人一個數據的指標,通過滑塊來改變該資料的值,該變數需要在回撥函式TrackbarCallback 中作用域可見,因此例程中將它定義為全域性變數
4、第四個引數,為傳人資料的最大值,用來控制資料的變化範圍
5、第五個引數,回撥函式的函式指標,當滑塊變化時,便呼叫回撥函式,實現融合畫面隨著滑塊的滑動而變化 下面我們來看下回調函式 on_trackbar, 它被定義了成一個static函式,意味著函式生命週期從被呼叫開始一直存在知道程式結束,第二個引數對應createTrackbar函式中的
第6個引數,使用者資料指標。