在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地区。
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。 |