鼠标事件的函数原型及参数
一、指定鼠标操作消息回调函数的函数为SetMouseCallback函数。
函数原型:
void SetMouseCallback(const string & winname,MouseCallback onMouse,void* userdata=0)
参数:
第一个参数为窗口的名字,
第二个参数用来指定窗口每次鼠标时候发生的时候,被调用函数指针,
第三个参数则为用户定义的传递到回调函数的参数。
二、函数指针原型:
void onEvent(int event ,int x ,int y ,int flags ,void * param)。
指针函数名称任意,但 参数必须按照这个顺序,
参数:
event 是鼠标响应类型,CV_EVENT_*变量之一:
EVENT_MOUSEMOVE滑动
EVENT_LBUTTONDOWN 左击
EVENT_RBUTTONDOWN 右击
EVENT_MBUTTONDOWN中键点击
EVENT_LBUTTONUP 左键放开
EVENT_RBUTTONUP 右键放开
EVENT_LBUTTONDBLCLK左键双击
EVENT_RBUTTONDBLCLK 右键双击
EVENT_MBUTTONDBLCLK 中键双击
x和y是鼠标指针在图像坐标系的坐标(不是窗口坐标系)。
flags是CV_EVENT_FLAG的组合,flag的状态有:
EVENT_FLAG_LBUTTON 左键拖拽
EVENT_FLAG_RBUTTON 右键拖拽
EVENT_FLAG_MBUTTON 中键拖拽
EVENT_FLAG_CTRLKEY 按住Ctrl不放
EVENT_FLAG_SHIFTKEY 按住Shift不放
EVENT_FLAG_ALTKEY 按住Alt不放
param是用户定义的传递到setMouseCallback函数调用的参数。
三、鼠标事件示例
static void onmouseEvent(int event, int x, int y, int flag, void* userdata) {
static Point sp(-1, -1);
static Point ep(-1, -1);
Mat bg = *((Mat*)userdata);
if (event == EVENT_LBUTTONDOWN) {
sp.x = x;
sp.y = y;
}
if (event == EVENT_LBUTTONUP) {
ep.x = x;
ep.y = y;
Rect rc(Point(sp.x, sp.y), Point(ep.x, ep.y));
rectangle(bg, rc, Scalar(0, 0, 255), 1, 8, 0);
cout << "startp" << sp << endl;
cout << "endp" << ep << endl;
imshow("鼠标绘图", bg);
sp.x = 0;
sp.y = 0;
}
if (event == EVENT_MOUSEMOVE && flag==EVENT_FLAG_LBUTTON) {
ep.x = x;
ep.y = y;
if (sp.x > 0 && sp.y > 0) {
Rect rc(Point(sp.x, sp.y), Point(ep.x, ep.y));
tempbg.copyTo(bg);
rectangle(bg, rc, Scalar(0, 0, 255), 1, 8, 0);
imshow("鼠标绘图", bg);
}
}
}
void myCV::mouseEvent()
{
namedWindow("鼠标绘图", WINDOW_AUTOSIZE);
static Mat bg = imread("05.jpg");
tempbg = bg.clone();
setMouseCallback("鼠标绘图", onmouseEvent, &bg);
imshow("鼠标绘图", bg);
}