setMouseCallback()
void setMouseCallback(const string &winname, MouseCallback onMouse, void* userdata=0);
winname
窗口的名字
onMouse
回调函数,每次鼠标事件发生时被调用的函数指针
这个函数的原型大概形式为
void func(int event, int x, int y, int flags, void* param);
event
EVENT_+变量之一
鼠标使用消息如下(去掉CV_)
#define CV_EVENT_MOUSEMOVE 0 滑动
#define CV_EVENT_LBUTTONDOWN 1 左键点击
#define CV_EVENT_RBUTTONDOWN 2 右键点击
#define CV_EVENT_MBUTTONDOWN 3 中键点击
#define CV_EVENT_LBUTTONUP 4 左键放开
#define CV_EVENT_RBUTTONUP 5 右键放开
#define CV_EVENT_MBUTTONUP 6 中键放开
#define CV_EVENT_LBUTTONDBLCLK 7 左键双击
#define CV_EVENT_RBUTTONDBLCLK 8 右键双击
#define CV_EVENT_MBUTTONDBLCLK 9 中键双击
flags:
#define CV_EVENT_FLAG_LBUTTON 1 左键拖曳
#define CV_EVENT_FLAG_RBUTTON 2 右键拖曳
#define CV_EVENT_FLAG_MBUTTON 4 中键拖曳
#define CV_EVENT_FLAG_CTRLKEY 8 (8~15)按Ctrl不放事件
#define CV_EVENT_FLAG_SHIFTKEY 16 (16~31)按Shift不放事件
#define CV_EVENT_FLAG_ALTKEY 32 (32~39)按Alt不放事件
x, y
鼠标指针在图像坐标系中的坐标值
flags
EVENT_FLAG的组合
param
用户定义的传递到SetMouseCallback函数调用的参数
userdata
用户定义的传递到回调函数的参数,默认值为0
Test
#include "opencv2/highgui.hpp"
#define WIN_NAME "WIN_FOR_TEST"
using namespace cv;
void on_MouseHandle(int event, int x, int y, int flags, void* param);
int sx,sy,ex,ey;
bool isDown=0;
int main()
{
namedWindow(WIN_NAME);
Mat Test_img = imread("test.png");
imshow(WIN_NAME, Test_img);
setMouseCallback(WIN_NAME, on_MouseHandle);
waitKey(0);
return 0;
}
void on_MouseHandle(int event, int x, int y, int flags, void* param)
{
switch(event)
{
case EVENT_LBUTTONDOWN :
{
isDown=1;
sx=x;
sy=y;
printf("sx:%d sy:%d ex:%d ey:%d\n",sx,sy,ex,ey);
break;
}
case EVENT_LBUTTONUP :
{
isDown=0;
break;
}
case EVENT_MOUSEMOVE :
{
if(isDown)
{
ex=x;
ey=y;
printf("sx:%d sy:%d ex:%d ey:%d\n",sx,sy,ex,ey);
}
}
}
}
参考
1.《OpenCV3编程入门》
2. OpenCV中响应鼠标消息 (转)