参考博客:http://www.cnblogs.com/lidabo/p/3437587.html
        鼠标操作属于用户接口设计,以前一直使用Qt来做,但是如果只需要简单的鼠标,键盘操作,直接调用opencv库的函数也未尝不可,鼠标操作之前已经接触很多了,在MFC,QT,OpenGL,等等中,理论主要就是两点,一是监控鼠标操作,鼠标点击,移动,松开,然后通过mouse_event识别判断出那一种鼠标的操作,根据不同的操作然后进行处理,二是在主函数中加入鼠标的回调函数,将鼠标操作与程序的窗口绑定。
1 .按钮事件代码

Mat org,dst,img,tmp;
void CQRCodeDemoDlg::OnBnClickedSetRoi()   //设置ROI区域(按钮事件)
{ imagedst.copyTo(img);  //图片接口imagedst.copyTo(tmp);  //临时变量namedWindow("view");//定义一个img窗口  setMouseCallback("view",on_mouse,0);//调用回调函数  imshow("view",img);  cv::waitKey(0);
}

2 .回调函数(由另外的一方调用的函数,用于对某一事件进行响应)

void on_mouse(int event,int x,int y,int flags,void *ustc)//event鼠标事件代号,x,y鼠标坐标,flags拖拽和键盘操作的代号
{  static Point pre_pt = (-1,-1);//初始坐标  static Point cur_pt = (-1,-1);//实时坐标  //char temp[16];  if (event == CV_EVENT_LBUTTONDOWN)//左键按下,读取初始坐标,并在图像上该点处划圆  {  imagedst.copyTo(img);//将原始图片复制到img中  // sprintf(temp,"(%d,%d)",x,y);  pre_pt = Point(x,y);  // putText(img,temp,pre_pt,FONT_HERSHEY_SIMPLEX,0.5,Scalar(0,0,0,255),1,8);//在窗口上显示坐标  circle(img,pre_pt,2,Scalar(255,0,0,0),CV_FILLED,CV_AA,0);//划圆  imshow("view",img);  }  else if (event == CV_EVENT_MOUSEMOVE && !(flags & CV_EVENT_FLAG_LBUTTON))//左键没有按下的情况下鼠标移动的处理函数  {  img.copyTo(tmp);//将img复制到临时图像tmp上,用于显示实时坐标  // sprintf(temp,"(%d,%d)",x,y);  cur_pt = Point(x,y);  //putText(tmp,temp,cur_pt,FONT_HERSHEY_SIMPLEX,0.5,Scalar(0,0,0,255));//只是实时显示鼠标移动的坐标  imshow("view",tmp);  }  else if (event == CV_EVENT_MOUSEMOVE && (flags & CV_EVENT_FLAG_LBUTTON))//左键按下时,鼠标移动,则在图像上划矩形  {  img.copyTo(tmp);  // sprintf(temp,"(%d,%d)",x,y);  cur_pt = Point(x,y);  //  putText(tmp,temp,cur_pt,FONT_HERSHEY_SIMPLEX,0.5,Scalar(0,0,0,255));  rectangle(tmp,pre_pt,cur_pt,Scalar(0,0,255,0),1,8,0);//在临时图像上实时显示鼠标拖动时形成的矩形  imshow("view",tmp);  }  else if (event == CV_EVENT_LBUTTONUP)//左键松开,将在图像上划矩形  {  imagedst.copyTo(img);  // sprintf(temp,"(%d,%d)",x,y);  cur_pt = Point(x,y);  // putText(img,temp,cur_pt,FONT_HERSHEY_SIMPLEX,0.5,Scalar(0,0,0,255));  circle(img,pre_pt,2,Scalar(255,0,0,0),CV_FILLED,CV_AA,0);  rectangle(img,pre_pt,cur_pt,Scalar(0,255,0,0),1,8,0);//根据初始点和结束点,将矩形画到img上  imshow("view",img);  img.copyTo(tmp);  //截取矩形包围的图像,并保存到dst中  int width = abs(pre_pt.x - cur_pt.x);  int height = abs(pre_pt.y - cur_pt.y);  if (width == 0 || height == 0)  {  printf("width == 0 || height == 0");  return;  }  //对原图进行裁剪dst =imagedst(Rect(min(cur_pt.x,pre_pt.x),min(cur_pt.y,pre_pt.y),width,height));  // namedWindow("dst");  //  imshow("dst",dst);     //显示的ROI区域图片waitKey(0);  }
}

3 .结果

[MFC] 绘制图像ROI区域(OpenCv库)相关推荐

  1. 【OpenCV】复制、切割出图像ROI区域

    对图像设定ROI的函数是: cvSetImageROI(IplImage* src,CvRect rect); src 表示的是源图像, rect 指的是ROI区域. 如果要取消ROI区域,那么使用函 ...

  2. android 自定义录像机,android-camera2 - 将自定义捕获请求构建器选项设置为使用Camera2 API捕获图像以使用OpenCV库进行摄像机校准 - 堆栈内存溢出...

    我们正在使用Camera2 API捕获N张图像,而未设置任何自定义捕获请求构建器选项. 我们正在使用这些图像通过OpenCV Android库411进行相机校准. 然后,我们正在使用OpenCV An ...

  3. [Python从零到壹] 三十七.图像处理基础篇之图像融合处理和ROI区域绘制

    欢迎大家来到"Python从零到壹",在这里我将分享约200篇Python系列文章,带大家一起去学习和玩耍,看看Python这个有趣的世界.所有文章都将结合案例.代码和作者的经验讲 ...

  4. opencv 手选roi区域_【opencv学习笔记六】图像的ROI区域选择与复制

    图像的数据量还是比较大的,对整张图片进行处理会影响我们的处理效率,因此常常只对图像中我们需要的部分进行处理,也就是感兴趣区域ROI.今天我们来看一下如何设置图像的感兴趣区域ROI.以及对ROI区域图像 ...

  5. Python+OpenCV 图像处理系列(5)—— 图像 ROI 操作及通道的拆分合并

    1. 图像 ROI 有时你需要对一幅图像的特定区域进行操作.例如我们要检测一副图像中眼睛的位置,我们首先应该在图像中找到脸,再在脸的区域中找眼睛,而不是直接在一幅图像中搜索.这样会提高程序的准确性和性 ...

  6. OpenCV--0016:图像ROI与ROI操作

    文章目录 一.图像ROI 1. 概念 2. 图像ROI操作 2.1 矩形感兴趣区域 2.1.1 使用Rect函数 2.1.2 使用Range 2.1.3 应用实例 2.2 不规则ROI区域 2.2.1 ...

  7. 转载:【OpenCV入门教程之四】 ROI区域图像叠加初级图像混合 全剖析

    [OpenCV入门教程之四] ROI区域图像叠加&初级图像混合 全剖析 浅墨_毛星云 2014-03-10 12:48:05 157425 收藏 19 最后发布:2014-03-10 12:4 ...

  8. 【opencv学习笔记】第五篇:访问图像中像素的三种方式、ROI区域图像叠加和图像混合

    1. 访问图像中像素的三种方式 任何图像处理算法,都是从操作每个像素开始的.在OpenCV中,提供了三种访问每个像素的方法. 方法1:指针访问:C操作符[] 方法2:迭代器iterator 方法3:动 ...

  9. 【OpenCV】IplImage类型图像ROI矩形区域的快速获取

    一直使用的是OpenCV C++的接口,但是有些只能用纯c的环境下,就不得不用c接口了,IplImage是c接口图像数据最基本的数据结构,获取其ROI区域的过程如下,首先通过cvSetImageROI ...

  10. opencv python3 找图片色块_Python 图像处理 OpenCV (3):图像属性、图像感兴趣 ROI 区域及通道处理...

    前文传送门: 图像属性 图像属性包括行数,列数和通道数,图像数据类型,像素数等. 1. 形状:shape 图像的形状可以通过 shape 关键字进行获取,使用 shape 关键的后,获取的信息包括行数 ...

最新文章

  1. ThreadGroup
  2. OpenCv实现两幅图像的拼接
  3. nodejs与npm版本对应表
  4. linux 模块化编译,手把手教Linux驱动1-模块化编程 module
  5. linux搭建mcpe服务器_Ubuntu Linux下搭建Minecraft我的世界服务器
  6. 实体类blob类型_Mysql的数据类型和JPA的实体类
  7. matlab2c使用c++实现matlab函数系列教程-disp函数
  8. urllib.error.URLError: <urlopen error [SSL: WRONG_VERSION_NUMBER] wrong version number 成功解决
  9. [Python人工智能] 四.神经网络和深度学习入门知识
  10. python中的nmap模块(编写扫描器)
  11. 浅谈“异常信息泄露(应用程序错误)”
  12. 分享 | 基于图像分类网络ResNet50_vd实现桃子分类
  13. 【每日一题】涂色PAINT
  14. Idea创建一个java项目
  15. vs进行cuda编程失败,报错“the provided PTX was compiled with an unsupported toolchain.”
  16. 云计算之云计算架构图
  17. 实现上传图片-生成唯一的名字
  18. 字符串与Date类型相互转换
  19. ios学习之旅--多态与点语法
  20. 2019牛客暑期多校训练营(第一场)E.ABBA

热门文章

  1. Sqlite3 stmt 机制操作
  2. SpringSecurity自定义多Provider时提示No AuthenticationProvider found for问题的解决方案与原理(四)
  3. Android自定义View,画一个好看带延长线的饼状图
  4. 逻辑谬误_跟上的谬误
  5. android ppt 转图片显示不全,ppt转pdf图片显示不全怎么办 这两种方法供您参考
  6. USB大容量存储设备禁用后恢复不了问题解决方案
  7. wxpy 扫码登录微信报错 KeyError: pass_ticket(网页版微信登录失败)
  8. 锁定计算机屏幕的快捷键是什么,锁住电脑屏幕的快捷键_打开电脑屏幕的快捷键...
  9. 使用ARM芯片的小型NAS设备的一次存储故障的检修
  10. sinx泰勒展开_利用泰勒公式求极限,函数需要展开到第几阶?