OpenCV中沒有實現按鈕的功能,我們可以利用滑動條來實現按鈕功能。
int createTrackerbar(const string& trackerbarname, const string winame, int* value, int count,
TrackbarCallback onChange=0, void* userdata=0);
trackbarname
軌跡條的名字。
winname
窗口的名字,軌跡條會依附在這個窗口上。
value
一個指向整型的指針,表示滑塊的位置,在創建時,滑塊的初始位置就是該變量當前的值。
count
滑塊可以達到的最大位置的值。滑塊最小位置的值始終為0。
onchange
指向回調函數的指針,每次滑塊位置改變時,這個函數都會進行回調。並且這個函數的原型必須為void XXXX(int,void*);其中第一個參數是軌跡條的位置,第二個參數是用戶數據(本函數中參數userdata)。如果回調函數是NULL指針,則表示沒有回調函數的調用,僅參數value有變化。
userdata
用戶傳給回調函數的數據,用來處理軌跡條事件。如果使用的value實參是全局變量,可以不去管userdata參數。
int getTrackbarPos(const string& trackbarname, const string& winname );
trackbarname
軌跡條的名字
winname
軌跡條的父窗口的名稱
實例
下面的代碼將wuli男神和wuli女神的圖片混合在一起,輸入圖片如下:
wuliEddie1.jpg
wuliShishi.jpg
MixAlphaImages.cxx
#include <opencv2/opencv.hpp> #include <opencv2/highgui/highgui.hpp> #define WINDOW_NAME "Mixed Images" // global variables const int g_nMaxAlphaValue = 100; // maximun alpha value int g_nAlphaValueSlider; // value from trackbar double g_dAlphaValue; double g_dBetaValue; // Mat objects for images cv::Mat g_srcImage1; cv::Mat g_srcImage2; cv::Mat g_dstImage; // on trackbar void on_Trackbar( int, void* ) { g_dAlphaValue = (double) g_nAlphaValueSlider/g_nMaxAlphaValue; g_dBetaValue = (1.0-g_dAlphaValue); addWeighted(g_srcImage1, g_dAlphaValue, g_srcImage2, g_dBetaValue, 0.0, g_dstImage); cv::imshow(WINDOW_NAME, g_dstImage); } // main int main( int argc, char** argv ) { // load image and show g_srcImage1 = cv::imread("wuliEddie1.jpg"); g_srcImage2 = cv::imread("wuliShishi1.jpg"); // NOTE: two image should be the same size if(!g_srcImage1.data) { printf("Error getting the first images. Put the image wuliEddie1.jpeg to Debug folder. \n"); return -1; } if(!g_srcImage1.data) { printf("Error getting the second images. Put the image wuliShishi1.jpeg to Debug folder. \n"); return -1; } // initialize trackbar value g_nAlphaValueSlider = 70; // create window cv::namedWindow(WINDOW_NAME, 1); // create trackbar char TrackbarName[50]; sprintf( TrackbarName, "Alpha Value %d", g_nMaxAlphaValue ); cv::createTrackbar( TrackbarName, WINDOW_NAME, &g_nAlphaValueSlider, g_nMaxAlphaValue, on_Trackbar ); // to show the initial image on_Trackbar(g_nAlphaValueSlider, 0); cv::waitKey(0); return 0; }
結果圖