OpenCV2中滑动条(Trackbar)回调函数的小发现
来源:互联网 发布:java异步处理机制 编辑:程序博客网 时间:2024/06/06 16:37
滑动条(Track)是*OpenCV*动态调节的辅助工具,如果只有0和1两个数值,还可以作为开关。网上有相当多的成品代码可以使用,但是介于篇幅的问题,基本上都是用全局变量这种不安全的编码方式写出来的代码。其实,OpenCV是有提供给我们不使用全局变量的方法的。以下就来介绍怎么修改。
首先我们先看一下全局变量的例子。
//-------------------【程序说明】----------------------------// 程序说明:// 程序描述:为程序界面添加滑动条// 开发测试所用IDE版本:Visual Studio 2013// 开发测试所用OpenCV版本:2.4.11// 2015年8月 Created by @klaokai//--------------------------------------------------------//---------------【头文件、命名空间包含部分】-------------------// 描述:包含程序所使用的头文件和命名空间//---------------------------------------------------------#include <opencv2/opencv.hpp>#include <opencv2/highgui/highgui.hpp>using namespace cv;//--------------------【宏定义部分】-------------------------- // 描述:定义一些辅助宏 //-------------------------------------------------------- #define WINDOW_NAME "【滑动条示例】" //为窗口标题定义的宏 //-------------------【全局变量声明部分】----------------------// 描述:全局变量声明//---------------------------------------------------------const int g_nMaxValue = 254;//的最大值int g_nValueSlider = 70;//声明存储图像的变量Mat g_dstImage = Mat(500 , 600 , CV_8UC1);//--------------------【on_Trackbar( )函数】----------------// 描述:响应滑动条的回调函数//---------------------------------------------------------void on_Trackbar(int , void*){ g_dstImage.setTo(g_nValueSlider); //显示效果图 imshow(WINDOW_NAME , g_dstImage);}//------------------------【main( )函数】-------------------// 描述:控制台应用程序的入口函数,我们的程序从这里开始执行//----------------------------------------------------int main(int argc , char** argv){ //创建窗体 namedWindow(WINDOW_NAME , 1); //在创建的窗体中创建一个滑动条控件 char TrackbarName[50]; sprintf(TrackbarName , "灰度值"); //创建滑动条 createTrackbar(TrackbarName , WINDOW_NAME , &g_nValueSlider , g_nMaxValue , on_Trackbar); //结果在回调函数中显示 on_Trackbar(0 , 0); //按任意键退出 waitKey(0); return 0;}
然后是修改后成局部变量的例子。
//-------------------【程序说明】----------------------------// 程序说明:// 程序描述:为程序界面添加滑动条// 开发测试所用IDE版本:Visual Studio 2013// 开发测试所用OpenCV版本:2.4.11// 2015年8月 Created by @klaokai//---------------------------------------------------------//---------------【头文件、命名空间包含部分】-------------------// 描述:包含程序所使用的头文件和命名空间//-------------------------------------------------------------------------------------------------#include <opencv2/opencv.hpp>#include <opencv2/highgui/highgui.hpp>using namespace cv;//----------------------【宏定义部分】----------------------- // 描述:定义一些辅助宏 //---------------------------------------------------------- #define WINDOW_NAME "【滑动条示例】" //为窗口标题定义的宏 //-----------------【on_Trackbar( )函数】-------------------// 描述:响应滑动条的回调函数//---------------------------------------------------------//第一个形参是当前滑动条的数值,第二个是createTrackbar函数最后传入的数据void on_Trackbar(int nValueSlider , void* dstImage){ //static_cast<>用于安全转换指针 Mat* tmpDst = static_cast<Mat*> (dstImage); tmpDst->setTo(nValueSlider); //显示效果图 imshow(WINDOW_NAME , *tmpDst);}//-----------------【main( )函数】--------------------------// 描述:控制台应用程序的入口函数,我们的程序从这里开始执行//---------------------------------------------------------int main(int argc , char** argv){ const int nMaxValue = 254;//的最大值 int nValueSlider = 70; //声明存储图像的变量 Mat dstImage = Mat(500 , 600 , CV_8UC1); //创建窗体 namedWindow(WINDOW_NAME , 1); //在创建的窗体中创建一个滑动条控件 char TrackbarName[50]; sprintf(TrackbarName , "灰度值"); //创建滑动条 //注意,这里最后添加上了数据的指针,不只是Mat类型,形参是一个void*类型的 createTrackbar(TrackbarName , WINDOW_NAME , &nValueSlider , nMaxValue , on_Trackbar , &dstImage); //按任意键退出 waitKey(0); return 0;}
注意代码中void*的转换,如果使用以下代码片段,则有可能在某些时候出现错误,具体是什么原因本人现在也没有弄清楚,但是以上第二段 static_cast<>()的方式就能解决这一问题。
Mat* tmpDst = (Mat*)dstImage;
0 0
- OpenCV2中滑动条(Trackbar)回调函数的小发现
- 类中函数作为回调函数发现的问题
- opencv2 trackbar的应用
- 【Ubuntu+OpenCV】HighGUI之trackbar(滑动条)的创建--学习笔记【2】
- 关于多线程中回调函数的一个小例子
- OpenCV 滑动条Trackbar C/C++/Python
- openCV滑动条TrackBar事件实例
- 回调函数理解的小例子
- opencv Trackbar实现带滚动条的视频播放,且滚动条可自动滑动
- 小程序-回调函数
- 回调函数的通俗理解(持续更新中)
- OpenGL中常用的回调函数
- Delphi中回调函数的使用
- DELPHI中回调函数的使用
- DELPHI中回调函数的使用
- VC中回调函数的用法
- V3d_View中回调函数的使用
- C++ 中回调函数的使用
- 【HDOJ 1009】 CRB and String
- UNIX Tutorial Eight
- C++友元类【未完待续】
- java annotation处理器
- 多态与反射的例子
- OpenCV2中滑动条(Trackbar)回调函数的小发现
- 使用Excel批量生成SQL脚本(小技巧)
- VBScript中处理浮点数相减的精度问题
- CodeForces 553A Kyoya and Colored Balls (排列组合)
- 拓野机器人:机器人浮动去毛刺主轴应用在哪些领域
- android中延迟执行某个任务
- CentOS6 默认源没有tmux的解决办法
- Java-IO包扩展功能的流对象
- 机房收费系统个人重构版:暮然回首,灯火阑珊