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個參數,用戶數據指針。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章