OpenCV_最简朴的鼠标截取ROI地区

打印 上一主题 下一主题

主题 513|帖子 513|积分 1549

在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按下不放

代码如下:

  1. void QuickDemo::mouseDrawing_Demo(Mat& image) {
  2.         namedWindow("鼠标绘制", WINDOW_AUTOSIZE);
  3.         setMouseCallback("鼠标绘制", onDraw, (void*)&image);
  4.         imshow("鼠标绘制", image);
  5.         temp = image.clone();
  6. }
复制代码
  1. Point sp(-1, -1);
  2. Point ep(-1, -1);
  3. Mat temp;
  4. static void onDraw(int event, int x, int y, int flags, void* userdata) {
  5.        
  6.         Mat image = *((Mat*)userdata);
  7.         if (event == EVENT_LBUTTONDOWN) {
  8.                 sp.x = x;
  9.                 sp.y = y;
  10.                 cout << "start point : " << sp << endl;
  11.         }
  12.         else if (event == EVENT_LBUTTONUP) {
  13.                 ep.x = x;
  14.                 ep.y = y;
  15.                 int dx = ep.x - sp.x;
  16.                 int dy = ep.y - sp.y;
  17.                 if (dx > 0 && dy > 0) {
  18.                         Rect box(sp.x, sp.y, dx, dy);
  19.                         rectangle(image, box, Scalar(0, 0, 255), 2, 8, 0);
  20.                         temp.copyTo(image);
  21.                         imshow("鼠标绘制", image);
  22.                         imshow("ROI区域绘制", image(box));
  23.                         sp.x = -1;
  24.                         sp.y = -1;
  25.                 }
  26.         }
  27.         else if (event == EVENT_MOUSEMOVE) {
  28.                 if (sp.x > 0 && sp.y > 0) {
  29.                         ep.x = x;
  30.                         ep.y = y;
  31.                         int dx = ep.x - sp.x;
  32.                         int dy = ep.y - sp.y;
  33.                         if (dx > 0 && dy > 0) {
  34.                                 Rect box(sp.x, sp.y, dx, dy);
  35.                                 temp.copyTo(image);
  36.                                 rectangle(image, box, Scalar(0, 0, 255), 2, 8, 0);
  37.                                 imshow("鼠标绘制", image);
  38.                         }
  39.                 }
  40.         }
  41. }
复制代码
1.鼠标按下,记录起始位置。
2.鼠标移动,起始位置固定,实时绘制四边形并显示。
3.鼠标松开,记录终点位置,并根据四边形来绘制ROI地区。



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

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

来自云龙湖轮廓分明的月亮

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表