理解createTrackbar函数

在Opencv中,createTrackbar函数可用于创建一个可以调整数值的滑动条。函数原型如下:

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

 参数1:滑动条轨迹名

 参数2:滑动条依附的窗口名

 参数3:滑块的位置,创建时,滑块初始位置就是这个变量当前的值

 参数4:轨迹的最大值

 参数5:回调函数

 参数6:默认0,用户传给回调函数的数据,如果第三个值为全局变量,忽略这个值.

如果使用第6个参数,则作为参数传给回调函数的usrdata

回调函数TrackbarCallback转定义如下

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

参数1:其中第一个参数是跟踪栏位置

参数2:第二个参数是用户数据,如果回调函数是NULL指针,则不会调用回调函数,而只会更新值(比如窗口中的图像数据地址)

(*TrackbarCallback)为函数void (int pos,void* userdata)的别名

onChange 为 TrackbarCallback类型的一个变量。关系如下:

地址1 = TrackbarCallback;变量1 = onChange;函数入口 = void (int pos,void* userdata) 的函数变量名;函数体 = void (int pos,void* userdata);

(*TrackbarCallback) =  变量1 = 函数体 ;也就是说赋给函数指针的函数应该和函数指针所指的函数原型是一致的

所以回调函数声明应为 void onChange(int,void*)。

例子源代码:

#include <iostream>  
#include <opencv/cv.hpp>  
#include <opencv2/core/core.hpp>  
#include <opencv2/highgui/highgui.hpp>  

using namespace std;
using namespace cv;
Mat img;
//定义了窗体名  
string winName = "二值化";

//TrackBar发生改变的回调函数  
void onChangeTrackBar(int pos, void* userdata);

//主函数  
int main()
{
    //trackbar名  
    string trackBarName = "pos";
    //图像文件名  
    string imgName = "demo.jpg";
    //trackbar的值  
    int posTrackBar = 0;
    //trackbar的最大值  
    int maxValue = 255;


    //读入图像,以灰度图形式读入  
    img = imread(imgName, 0);
    //新建窗口  
    namedWindow(winName);
    imshow(winName, img);
    //创建trackbar,我们把img作为数据传进回调函数中  
    createTrackbar(trackBarName, winName, &posTrackBar, maxValue, onChangeTrackBar);

    waitKey();
    return 0;
}

// 回调函数  
void onChangeTrackBar(int pos, void* usrdata)
{
    Mat src = img;
    Mat dst;
    // 二值化  
    threshold(src, dst, pos, 255, 0);

    imshow(winName, dst);  
}

第6个参数使用例子:

源代码

#include <iostream>  
#include <opencv/cv.hpp>  
#include <opencv2/core/core.hpp>  
#include <opencv2/highgui/highgui.hpp>  

using namespace std;
using namespace cv;
//Mat img;    //如果定义为全局变量,则不用管创建滑动条第6个参数
//定义了窗体名  
string winName = "二值化";
//TrackBar发生改变的回调函数  
void onChangeTrackBar(int pos, void* userdata);

//主函数  
int main()
{
    Mat img;
    //trackbar名  
    string trackBarName = "pos";
    //图像文件名  
    string imgName = "demo.jpg";
    //trackbar初始位置的值  
    int posTrackBar = 0;
    //trackbar的最大值  
    int maxValue = 255;
    //读入图像,以灰度图形式读入  
    img = imread(imgName, 0);
    //新建窗口  
    namedWindow(winName);
    imshow(winName, img);
    //创建trackbar,我们把img作为数据传进回调函数中  
    createTrackbar(trackBarName, winName, &posTrackBar, maxValue, onChangeTrackBar,&img);

    waitKey();
    return 0;
}

// 回调函数  
void onChangeTrackBar(int pos, void* usrdata)
{
    
//第三个参数作为pos传进来
   //第6个参数作为usrdata传进来 //img是地址,类型为void*,先进行强制类型转换,成为Mat* //左边为cv::Mat* 类型,右边也要一样 Mat src =*(Mat*)(usrdata); Mat dst; // 二值化 threshold(src, dst, pos, 255, 0); imshow(winName, dst); }

此文为博主原创,如若转载请注明出处:http://www.cnblogs.com/Fsiswo/p/8030649.html 

2017-12-13 02:40:45

本文由作者原创,如需转载注明出处!
原文地址:https://www.cnblogs.com/Fsiswo/p/8030649.html