OpenCV創建滑動條

利用OpenCV的createTrackbar()函數創建一個可以 調整數值的滑動條,並將滑動條附加到指定的窗口上。

createTrackbar函數的原型:

int createTrackbar(const String& trackbarname, const String& winname,
                              int* value, int count,
                              TrackbarCallback onChange = 0,
                              void* userdata = 0);

第一個參數trackbarname是軌跡條的名字,代表我們創建的軌跡條。

第二個參數winname是窗口的名字,代表這個軌跡條會依附到哪個窗口上,即對應 nameWindow()創建窗口時填的某一個窗口名。

第三個參數是一個指向整形的指針,表示滑塊的位置。在創建時,滑塊的初始值就是該變量當前的值。

第四個參數是int型的count,表示滑塊可以達到的最大位置的值。滑塊最小位置的值始終爲0。

第五個參數,是TrackbarCallBack類型的onchange,默認值爲0,其中TrackbarCallBack是 函數指針:

typedef void (*TrackbarCallback)(int pos, void* userdata);

這是一個指向 回調函數 的指針,每次滑塊位置改變時,這個函數都會進行回調。這個函數的返回值是void型,兩個參數分別是int型和void*型,第一個參數int pos表示軌跡條的位置,第二個參數void* userdata 是用戶數據(見下面第六個參數)。如果回調函數是NULL指針,則表示沒有回調函數的調用,僅僅是createTrackbar()函數的第三個參數value的值有變化。

第六個參數,void*類型的userdata,默認值是0。這個參數是用戶傳給回調函數的數據,用來處理軌跡條事件。如果使用的第三個參數value的實參是全局變量的話,可以不用管這個userdata參數。

一、代碼:

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


//----------------------------【宏定義部分】----------------------------
//描述:定義一些輔助宏
constexpr auto 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_dAlphaValue = (1.0 - g_dAlphaValue);

	//根據 alpha 和 beta 的值 進行 線性混合 addWeighted()函數
	addWeighted(g_srcImage1, g_dAlphaValue, g_srcImage2, g_dAlphaValue, 0.0, g_dstImage);
        //void addWeighted(InputArray src1, double alpha, InputArray src2, double beta, double gamma, OutputArray dst, int dtype = -1);
	//dst = src1[I]*alpha + src2[I]*beta + gamma;
	//顯示效果圖
	imshow(WINDOW_NAME, g_dstImage);
}

//----------------------------【main函數】----------------------------
int main()
{
	// 加載圖像(兩圖像的尺寸需相同)
	g_srcImage1 = imread("F:\\TuPian\\1.jpg",1);
	g_srcImage2 = imread("F:\\TuPian\\2.jpg",1);
	if (g_srcImage1.data == NULL)
	{
		printf("讀取第一幅圖片錯區,請確定目錄下是否有imread函數指定的圖片存在!\n");
		return -1;
	}
	if (g_srcImage2.data == NULL)
	{
		printf("讀取第一幅圖片錯區,請確定目錄下是否有imread函數指定的圖片存在!\n");
		return -1;
	}

	// 設置滑動條初值爲70
	g_nAlphaValueSlider = 70;

	// 創建窗體
	namedWindow(WINDOW_NAME, 1);    //注意是namedWindow,不是nameWindow

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

	createTrackbar(TrackbarName, WINDOW_NAME, &g_nAlphaValueSlider, g_nMaxAlphaValue, on_Trackbar);  //onTrackbar是回調函數

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

	//按任意鍵退出f
	waitKey(0);

	return 0;
	//std::cout << "Hello World!\n"; 
}

二、效果:

 

 可以調整滑動條來改變混合效果:

參考:《OpenCV3編程入門》毛星雲、冷雪飛等編著,電子工業出版社,2018年11月第19次印刷,p73-76。 

 

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