zoukankan      html  css  js  c++  java
  • 理解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

    本文由作者原创,如需转载注明出处!
  • 相关阅读:
    Pandas包对多个数据表(DataFrame)的常用整合功能。
    pandas numpy 简单应用 loandata
    榛果 美团 登录 爬虫 requests session
    python 日期循环
    opencv 验证码 识别
    运行MapReduce任务
    CenOS安装MySQL服务
    leetcode 67. 二进制求和
    最近对一些领域比较感兴趣,这里列举出来供以后查阅
    leet code 1014. 最佳观光组合
  • 原文地址:https://www.cnblogs.com/Fsiswo/p/8030649.html
Copyright © 2011-2022 走看看