opencv3編程入門——學習筆記(2)用軌跡條來控制兩圖像Alpha融合

        自己立下的flag,熬夜也要完成呀,繼續更博。今天看到了第三章,對在窗口中加軌跡條,以及簡單的alpha融合有了一個簡單的認識。

        還是先說alpha融合,其實個人認爲就是兩幅圖片在各自乘上各自的透明度權值然後再用addweight函數做個簡單的混合就可以。(上面的那個函數是什麼大家可以自行百度,或者參考https://blog.csdn.net/gujiligujili/article/details/7650523)

        然後遇到的一點小問題就是在寫軌跡條函數時出現了一個“回調函數”。先解釋一下回調函數,說一下自己的理解。回調函數形式上不是由某一條代碼明顯獨立的在主函數中調用,而是在某個其他函數中作爲一個對這個函數的響應。(有點亂,舉個栗子,A是B的回調函數。意味着,在執行B函數時,A函數作爲執行B的一個響應,也會執行。)形式上還要注意,回調函數A的調用不是寫在B的函數體內,而是在B的參數中。A的函數名(其實就是這個函數的地址)作爲B的一個參數。額。。。不知道講清楚沒,一會看一下代碼可能會更明白。

        不多說先上結果:


這其實是兩張圖,當透明值爲0或者爲100時就會顯示兩張原圖。


調節透明度後的效果。好了上代碼:

#include <opencv2/opencv.hpp>
#include <opencv2/highgui/highgui.hpp>
using namespace cv;

#define WINDOW_NAME "【線性混合示例】"

//----------------------全局變量的聲明------------------

const int g_nMaxAlphaValue = 100;//Alpha值的最大值
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值和bete值進行線性混合
	addWeighted(g_srcImage1, g_dAlphaValue, g_srcImage2, g_dBetaValue, 0.0, g_dstImage);

	//顯示效果圖
	imshow(WINDOW_NAME, g_dstImage);
}

int main()
{
	g_srcImage1 = imread("1.jpg");
	g_srcImage2 = imread("2.jpg");

	//設置滑動條初始值爲70
	g_nAlphaValueSlider = 70;
	
	//創建窗口
	namedWindow(WINDOW_NAME, 1);

	//在窗口裏創建一個滑動條控件
	char TrackbarName[50];
	sprintf(TrackbarName, "透明值 %d", g_nMaxAlphaValue);

	createTrackbar(TrackbarName, WINDOW_NAME, &g_nAlphaValueSlider, g_nMaxAlphaValue, on_Trackbar);

	//結果在回調函數中顯示
	on_Trackbar(g_nAlphaValueSlider, 0);

	waitKey(0);
	return 0;
}

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