(12条消息) setmousecallback的说明
**
setmousecallback的说明
**
void setMousecallback(const string& winname, MouseCallback onMouse, void* userdata=0)
winname:窗口的名字
onMouse:鼠标响应函数,回调函数。指定窗口里每次鼠标时间发生的时候,被调用的函数指针。 这个函数的原型应该为void onMouse(int event, int x, int y, int flags, void* param);
userdate:传给回调函数的参数
event:
#defineCV_EVENT_MOUSEMOVE 0 移动
#defineCV_EVENT_LBUTTONDOWN 1 左键按下
#defineCV_EVENT_RBUTTONDOWN 2 右键按下
#defineCV_EVENT_MBUTTONDOWN 3 中键按下
#defineCV_EVENT_LBUTTONUP 4 左键升起
#defineCV_EVENT_RBUTTONUP 5 右键升起
#defineCV_EVENT_MBUTTONUP 6 中键升起
#defineCV_EVENT_LBUTTONDBLCLK 7 左键双击
#defineCV_EVENT_RBUTTONDBLCLK 8 右键双击
#defineCV_EVENT_MBUTTONDBLCLK 9 中键双击
flag:
#defineCV_EVENT_FLAG_LBUTTON 1 左键拖曳
#defineCV_EVENT_FLAG_RBUTTON 2 右键拖曳
#defineCV_EVENT_FLAG_MBUTTON 4 中键拖曳
#defineCV_EVENT_FLAG_CTRLKEY 8 (8~15)按Ctrl不放事件
#defineCV_EVENT_FLAG_SHIFTKEY 16 (16~31)按Shift不放事件
#defineCV_EVENT_FLAG_ALTKEY 32 (32~39)按Alt不放事件
event是鼠标动作,flag是鼠标动作标志符,两者结合就能描述鼠标的各种动作了。如果要描述鼠标拖拽画线的操作,可以这样判断
event == CV_EVENT_MOUSEMOVE && (flags & CV_EVENT_FLAG_LBUTTON)
关于使用setmousecallback的几点注意事项
1)回调函数是void类型的,也就是说没有返回值,如果要把某变量的值传回main,有两种方法:1、把该变量定义为全局变量;2、把要回传的参数写成一个类,参照 http://blog.csdn.net/gxiaob/article/details/8213796
2)回调函数一旦运行就会监听鼠标动作,相当于开了一个和main并行的进程,该进程会随着main结束而结束。
这一点可以从上面的程序得到印证。同样是抠图,程序1用的是视频,程序2和程序3用的是图片,程序1的图片显示在main中实现,程序2和程序3是在回调函数中实现。如果我们想用图片,并且在main中显示结果,那么必须将原main程序的主体放在一个循环里。也就是让程序不停地显示图片,不停的监听。否则,虽然回调函数还在监听鼠标动作,但main已经运行到程序结尾处。尽管回调函数获得的参数是对的,但main里已经没有变量来接受这些参数了。
3)一般情况下,回调函数一旦运行就会一直运行,除非主函数结束。而这会占用系统资源,我们可以在获得想要的参数后中止回调函数运行。方法是destroyWindow( ),只要监听的窗口没了,回调函数也就结束了。