openCV HighGUI图形用户界面--滑动条的创建和使用

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接: https://blog.csdn.net/qq_39504764/article/details/100531654

OpenCV里提供了一个很好用的工具——滑动条(Trackbar),它依附于窗口而存在。

createTrackbar()函数

此函数的作用:为我们创建了一个具有特定名称和范围的轨迹条,指定一个和轨迹位置同步的变量,而且要指定回调函数onChange,在轨迹条位置改变的时候来调用这个回调函数。

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

参数说明

  • 参数1:滑动条的名称。
  • 参数2:窗口的名称,就是说这个创建的滑动条所要依附到哪个窗口上。
  • 参数3:表示滑块的位置。在创建时,滑块的初始位置就是该变量当前的值。
  • 参数4:表示滑块可以滑到的最大值位置。滑块的最小值始终为0。
  • 参数5:TrackbarCallback类型的onChange,它有默认值为0。这是一个指向回调函数的指针,每次滑块位置改变时,这个函数都会进行回调。并且这个函数的原型必须为 void XXXXX(int, void*);
  • 参数6:void*类型的userdata,它也有默认值为0。这个参数是用户传给回调函数的数据,用来处理滑动条的调用。如果使用的第3个参数value实参是全局变量的话,完全可以不用去管这个userdata参数。

回调函数:就是一个通过函数指针调用的函数。如果我们把函数的指针(地址)作为参数传递给另一个函数,当这个指针被用来调用其所指向的函数时,就称其为回调函数。回调函数不由该函数的实现方直接调用,而是在特定的事件或条件发生时由另外的一方调用,用于对该事件或条件进行响应。

#include <opencv2/opencv.hpp>
#include <opencv2/highgui/highgui.hpp>
using namespace cv;
#define WINDOW_NAME "example"        //为窗口标题定义的宏

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和beta值进行线性混合
    addWeighted( g_srcImage1, g_dAlphaValue, g_srcImage2, g_dBetaValue, 0.0, g_dstImage);
    
    //显示效果图
    imshow( WINDOW_NAME, g_dstImage );
}


int main( int argc, char** argv )
{
    //加载图像 (两图像的尺寸需相同)
    g_srcImage1 = imread("1.jpg");
    g_srcImage2 = imread("2.jpg");
    if( !g_srcImage1.data ) { printf("读取第一幅图片错误,请确定目录下是否有imread函数指定图片存在~! \n"); return -1; }
    if( !g_srcImage2.data ) { printf("读取第二幅图片错误,请确定目录下是否有imread函数指定图片存在~!\n"); return -1; }
    
    //设置滑动条初值为70
    g_nAlphaValueSlider = 70;
    
    //创建窗体
    namedWindow(WINDOW_NAME, 1);
    
    //在创建的窗体中创建一个滑动条控件
    char TrackbarName[50];
    sprintf( TrackbarName, "value %d", g_nMaxAlphaValue ); //把g_nMax以定义好的格式写到TrackbarName数组中
    
    createTrackbar( TrackbarName, WINDOW_NAME, &g_nAlphaValueSlider, g_nMaxAlphaValue, on_Trackbar );
    //结果在回调函数中显示
    on_Trackbar( g_nAlphaValueSlider,0);
    
    //按任意键退出
    waitKey(0);
    
    return 0;
}

在这里插入图片描述

获取当前轨迹条的位置:getTrackbarPos()函数

printf("获取当前轨迹条的位置:%d\n",getTrackbarPos(TrackbarName, WINDOW_NAME) );

猜你喜欢

转载自blog.csdn.net/qq_39504764/article/details/100531654