利用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。