理解createTrackbar函数
在Opencv中,createTrackbar函数可用于创建一个可以调整数值的滑动条。函数原型如下:
CV_EXPORTS int createTrackbar(const String& trackbarname,const String& winname,int* value, int count, TrackbarCallback onChange = 0,void* 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
理解createTrackbar函数相关推荐
- 深入理解javascript函数系列第二篇——函数参数
前面的话 javascript函数的参数与大多数其他语言的函数的参数有所不同.函数不介意传递进来多少个参数,也不在乎传进来的参数是什么数据类型,甚至可以不传参数.本文是深入理解javascript函数 ...
- C++深入理解虚函数
c++深入理解虚函数 虚函数的使用方法: (1)在基类用virtual声明成员函数为虚函数.这样就可以在派生类中重新定义此函数,为它赋予新的功能,并能方便被调用. 在类外定义虚函数时,不必在定义vir ...
- 【Python】深入理解Python函数的9个黄金法则
编程离不开函数.Python的函数除了具备传统意义上的函数特征外,又被赋予了其他一些特性,让它更灵活.更强大.这篇文章结合之前我推荐的一本Python宝书,又添加一些我的实践和理解,总结了深入理解Py ...
- python函数可以作为容器对象吗_正确理解Python函数是第一类对象
正确理解 Python函数,能够帮助我们更好地理解 Python 装饰器.匿名函数(lambda).函数式编程等高阶技术. 函数(Function)作为程序语言中不可或缺的一部分,太稀松平常了.但函数 ...
- 正确理解Python函数是第一类对象
正确理解 Python函数,能够帮助我们更好地理解 Python 装饰器.匿名函数(lambda).函数式编程等高阶技术. 函数(Function)作为程序语言中不可或缺的一部分,太稀松平常了.但函数 ...
- 【OpenCV】OpenCV函数精讲之 -- createTrackbar()函数、getTrackbarPos()函数
目录 1.创建滑动条:createTrackbar()函数 2.获取当前轨迹条的位置:getTrackbarPos()函数 1.创建滑动条:createTrackbar()函数 createTrack ...
- 用实际例子理解回调函数(Calback)
用实际例子理解回调函数(Calback) 在我们编码的过程中,调用和回调几乎无处不在,但是我对回调函数到底是怎样一回事并没有一个真正透彻的理解,最近我查找学习了一些资料,学到了很多. 我参考了一些知乎 ...
- 【C语言】函数的理解——关于函数的声明
函数的理解--关于函数的声明 #include <stdio.h> //void sumx(int begin,int end);//函数的声明 void sumx(int ,int ) ...
- 阅读并理解lv_demo_widgets()函数
阅读并理解lv_demo_widgets()函数 现在我就是一个小白,我们用左键点进去这个函数lv_demo_widgets(),在LVGL.Simulator.cpp文件107行中.当前任务就是理解 ...
- 两分钟快速理解成本函数(cost function)
对成本函数(cost function)的理解 成本函数是用以衡量假设函数h(x)准确性的工具. 直接上公式, 是不是有种熟悉感,最小二乘法,没错,对比理解一下就好了.该函数也被称为"平方误 ...
最新文章
- ajax 阻止默认提交,jQuery验证插件:在对ajax调用servlet时,submitHandler不会阻止默认提交-返回false无效...
- 2017年9月2日普级组T1 正方形
- 作者:陈威,电子科技大学互联网科学中心硕士生。
- vuejs路由插件:vue-router的工作原理
- scala 连接符_Scala标识符示例教程
- SharePoint 2010 Form 认证 之 配制
- oracle读取blob字段的方法,如何读取Oracle的BLOB字段里的文件?
- 怎么在pta上搜题_在电脑上搜题,是不用模拟器的那种
- kettle作业定时如何在开源调度工具taskctl里实现
- 顺丰同城赴港IPO 有望凭借高增速和生态布局成为第三方即时配送平台第一股
- SG90舵机驱动,有代码
- 站在22岁的边上--我的2007
- Centos7安装加速下载工具aria2
- 关于 国产麒麟系统编译Qt项目是报错:error: cannot find -lGL 的解决方法
- jquery 监听input输入停止,实现文本框自动跳转
- LiveNVR监控摄像头Onvif/RTSP接入流媒体平台如何配置默认用户账户及用户密码
- 九连环课程设计c语言,用C语言编程解九连环
- Python定时获取外网IP地址并发送邮件
- osgEarth目标选择
- 数据库管理系统MySQL(一)
热门文章
- 2021-06-13并发线程控制方法3种
- c语言汇编程序100例,汇编语言100例
- python语言是二进制语言吗_在大型项目上,Python 是个烂语言吗?
- Hyperledger Fabric教程(7)--启动fabric区块链网络 如何查看节点日志
- python退出程序 只跳出while_为什么我的简单程序从不退出while循环?
- 十、Oracle学习笔记:基本查询语句各子句用法
- 六、Oracle学习笔记:字符串函数
- Android 控件 之 菜单(Menu)
- JAVA语法——选择排序
- 网络流(最大流) CQOI 2015 BZOJ 3931 网络吞吐量