1. 程式人生 > >OpenCV3:圖片融合例程——addWeighted(),createTrackbar()函式使用

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個引數,使用者資料指標。