滑动条 Trackbar[OpenCV 笔记9]

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. 
");
        return -1;
    }
    if(!g_srcImage1.data)
    {
        printf("Error getting the second images. Put the image wuliShishi1.jpeg to Debug folder. 
");
        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;
}

 结果图

原文地址:https://www.cnblogs.com/Xiaoyan-Li/p/5677281.html