在OpenCV中也存在鼠标的操作,今天我们先介绍一下鼠标中的操作事件
void setMousecallback(const string& winname, MouseCallback onMouse, void* userdata=0)
setMousecallback参数说明:
winname:窗口的名字
onMouse:鼠标响应函数,回调函数。指定窗口里每次鼠标时间发生的时候,被调用的函数指针。
这个函数的原型应该为void on_Mouse(int event, int x, int y, int flags, void* param);
userdate:传给回调函数的参数
MouseCallback函数定义为:
typedef void(* cv::MouseCallback)(int event,int x,int y,int flags,void *useradata);
参数说明:
event: 鼠标事件
x : 鼠标事件的x坐标
y : 鼠标事件的y坐标
flags: 鼠标事件的标志
userdata : 可选的参数
鼠标事件主要有下面几种:
CV_EVENT_MOUSEMOVE :鼠标移动
CV_EVENT_LBUTTONDOWN : 鼠标左键按下
CV_EVENT_RBUTTONDOWN : 鼠标右键按下
CV_EVENT_MBUTTONDOWN : 鼠标中键按下
CV_EVENT_LBUTTONUP : 鼠标左键放开
CV_EVENT_RBUTTONUP : 右键放开
CV_EVENT_MBUTTONUP : 中键放开
CV_EVENT_LBUTTONDBLCLK : 左键双击
CV_EVENT_RBUTTONDBLCLK : 右键双击
CV_EVENT_MBUTTONDBLCLK : 中键双击
CV_EVENT_MOUSEWHEEL : 鼠标向前(+)或向后(-)滑动
CV_EVENT_MOUSEHWHEEL : 鼠标向右(+)或向左(-)滑动
Flags主要有一下几种:
CV_EVENT_FLAG_LBUTTON :左键拖拽
CV_EVENT_FLAG_RBUTTON : 右键拖拽
CV_EVENT_FLAG_MBUTTON : 中键拖拽
CV_EVENT_FLAG_CTRLKEY : Ctrl按下不放
CV_EVENT_FLAG_SHIFTKEY : shift按下不放
CV_EVENT_FLAG_ALTKEY : alt按下不放
代码如下:
void QuickDemo::mouseDrawing_Demo(Mat& image) {namedWindow("鼠标绘制", WINDOW_AUTOSIZE);setMouseCallback("鼠标绘制", onDraw, (void*)&image);imshow("鼠标绘制", image);temp = image.clone();
}
Point sp(-1, -1);
Point ep(-1, -1);
Mat temp;
static void onDraw(int event, int x, int y, int flags, void* userdata) {Mat image = *((Mat*)userdata);if (event == EVENT_LBUTTONDOWN) {sp.x = x;sp.y = y;cout << "start point : " << sp << endl;}else if (event == EVENT_LBUTTONUP) {ep.x = x;ep.y = y;int dx = ep.x - sp.x;int dy = ep.y - sp.y;if (dx > 0 && dy > 0) {Rect box(sp.x, sp.y, dx, dy);rectangle(image, box, Scalar(0, 0, 255), 2, 8, 0);temp.copyTo(image);imshow("鼠标绘制", image);imshow("ROI区域绘制", image(box));sp.x = -1;sp.y = -1;}}else if (event == EVENT_MOUSEMOVE) {if (sp.x > 0 && sp.y > 0) {ep.x = x;ep.y = y;int dx = ep.x - sp.x;int dy = ep.y - sp.y;if (dx > 0 && dy > 0) {Rect box(sp.x, sp.y, dx, dy);temp.copyTo(image);rectangle(image, box, Scalar(0, 0, 255), 2, 8, 0);imshow("鼠标绘制", image);}}}
}
1.鼠标按下,记录起始位置。
2.鼠标移动,起始位置固定,实时绘制四边形并显示。
3.鼠标松开,记录终点位置,并根据四边形来绘制ROI区域。