前言
既然在上一篇中提到了回调函数,Shaun 就干脆把 OpenCV 中较常使用的两个使用回调函数的函数使用方法也一并记录下来吧。
说明篇
OpenCV 中使用回调函数的两个函数为:
鼠标事件响应操作函数:
void cv::setMouseCallback(const string& winname, MouseCallback onMouse, void* userdata = 0);
参数浅解:
const string& winname
:窗口名称,对名为winname的窗口执行鼠标事件响应操作;MouseCallback onMouse
:鼠标响应事件回调函数,监听鼠标的点击,移动,松开,判断鼠标的操作类型并做出相应处理;void* userdata
:对应回调函数的可选参数,若使用全局变量可以忽略该参数。对应的回调函数声明为:
typedef void (*MouseCallback)(int event, int x, int y, int flags, void* userdata);
参数浅解:
int event
:鼠标滑动(CV_EVENT_MOUSEMOVE)、左键单击(CV_EVENT_LBUTTONDOWN)、右键单击(CV_EVENT_RBUTTONDOWN )等10种鼠标点击事件的int型代号;int x, int y
:鼠标位于窗口的(x,y)坐标位置,窗口左上角默认为原点,向右为x正轴,向下为y正轴;int flags
:鼠标左键拖拽(CV_EVENT_FLAG_LBUTTON)、右键拖拽(CV_EVENT_FLAG_RBUTTON)等6种鼠标拖拽事件的int型代号;void* userdata
:回调函数的参数,若使用全局变量可以忽略该参数。创建滑动条函数:
int cv::createTrackbar(const string& trackbarname, const string& winname, int* value, int count, TrackbarCallback onChange=0, void* userdata=0);
参数浅解:
const string& trackbarname
:创建的滑动条名称;const string& winname
:所在窗口名称,对名为winname的窗口添加滑动条;int* value
:滑块的位置,其初始值对应滑块的初始位置;int count
:滑块可达到的最大位置的值,滑块最小位置的值总为0;TrackbarCallback onChange
:滑动条事件回调函数,当滑动条上位置改变的时,则执行该回调函数;void* userdata
:对应回调函数的可选参数,若使用全局变量可以忽略该参数。对应的回调函数声明为:
typedef void (CV_CDECL *TrackbarCallback)(int pos, void* userdata);
参数浅解:
int pos
:滑动条的位置对应的值;void* userdata
:回调函数的参数,若使用全局变量可以忽略该参数。
※注:本文的函数说明采用的是 opencv-2.4.11 的函数声明,与 opencv-3.2.0 的函数声明区别在于 string
类型,opencv-3.2.0 采用的是其自己实现的一个 String
类。
实例篇
Show u the code,具体 C++ 实现代码为:
1 |
|
经 Shaun 测试,上面示例程序在 Win10 的 VS2013 中 opencv-2.4.11 和 opencv-3.2.0 下都能完美运行。
后记
本来这两个函数都已经写(chao)好了,但为了更好的体现示例程序,又稍作了修改:添加鼠标左键拖拽事件及不使用全局变量等。
参考资料
[1] opencv2 使用鼠标绘制矩形并截取和保存矩形区域图像(http://www.cnblogs.com/lidabo/category/516776.html)
[2] Opencv中添加进度条及回调函数(http://blog.csdn.net/weixin_35738542/article/category/6337413)
[3] OpenCV2中滑动条(Trackbar)回调函数的小发现(http://blog.csdn.net/u014291399/article/category/3097955)
[4] OpenCV GUI基本操作,回调函数,进度条,裁剪图像等(http://blog.csdn.net/wangyaninglm/article/category/1653815)