[MFC] 绘制图像ROI区域(OpenCv库)
参考博客: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库)相关推荐
- 【OpenCV】复制、切割出图像ROI区域
对图像设定ROI的函数是: cvSetImageROI(IplImage* src,CvRect rect); src 表示的是源图像, rect 指的是ROI区域. 如果要取消ROI区域,那么使用函 ...
- android 自定义录像机,android-camera2 - 将自定义捕获请求构建器选项设置为使用Camera2 API捕获图像以使用OpenCV库进行摄像机校准 - 堆栈内存溢出...
我们正在使用Camera2 API捕获N张图像,而未设置任何自定义捕获请求构建器选项. 我们正在使用这些图像通过OpenCV Android库411进行相机校准. 然后,我们正在使用OpenCV An ...
- [Python从零到壹] 三十七.图像处理基础篇之图像融合处理和ROI区域绘制
欢迎大家来到"Python从零到壹",在这里我将分享约200篇Python系列文章,带大家一起去学习和玩耍,看看Python这个有趣的世界.所有文章都将结合案例.代码和作者的经验讲 ...
- opencv 手选roi区域_【opencv学习笔记六】图像的ROI区域选择与复制
图像的数据量还是比较大的,对整张图片进行处理会影响我们的处理效率,因此常常只对图像中我们需要的部分进行处理,也就是感兴趣区域ROI.今天我们来看一下如何设置图像的感兴趣区域ROI.以及对ROI区域图像 ...
- Python+OpenCV 图像处理系列(5)—— 图像 ROI 操作及通道的拆分合并
1. 图像 ROI 有时你需要对一幅图像的特定区域进行操作.例如我们要检测一副图像中眼睛的位置,我们首先应该在图像中找到脸,再在脸的区域中找眼睛,而不是直接在一幅图像中搜索.这样会提高程序的准确性和性 ...
- 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 ...
- 转载:【OpenCV入门教程之四】 ROI区域图像叠加初级图像混合 全剖析
[OpenCV入门教程之四] ROI区域图像叠加&初级图像混合 全剖析 浅墨_毛星云 2014-03-10 12:48:05 157425 收藏 19 最后发布:2014-03-10 12:4 ...
- 【opencv学习笔记】第五篇:访问图像中像素的三种方式、ROI区域图像叠加和图像混合
1. 访问图像中像素的三种方式 任何图像处理算法,都是从操作每个像素开始的.在OpenCV中,提供了三种访问每个像素的方法. 方法1:指针访问:C操作符[] 方法2:迭代器iterator 方法3:动 ...
- 【OpenCV】IplImage类型图像ROI矩形区域的快速获取
一直使用的是OpenCV C++的接口,但是有些只能用纯c的环境下,就不得不用c接口了,IplImage是c接口图像数据最基本的数据结构,获取其ROI区域的过程如下,首先通过cvSetImageROI ...
- opencv python3 找图片色块_Python 图像处理 OpenCV (3):图像属性、图像感兴趣 ROI 区域及通道处理...
前文传送门: 图像属性 图像属性包括行数,列数和通道数,图像数据类型,像素数等. 1. 形状:shape 图像的形状可以通过 shape 关键字进行获取,使用 shape 关键的后,获取的信息包括行数 ...
最新文章
- ThreadGroup
- OpenCv实现两幅图像的拼接
- nodejs与npm版本对应表
- linux 模块化编译,手把手教Linux驱动1-模块化编程 module
- linux搭建mcpe服务器_Ubuntu Linux下搭建Minecraft我的世界服务器
- 实体类blob类型_Mysql的数据类型和JPA的实体类
- matlab2c使用c++实现matlab函数系列教程-disp函数
- urllib.error.URLError: <urlopen error [SSL: WRONG_VERSION_NUMBER] wrong version number 成功解决
- [Python人工智能] 四.神经网络和深度学习入门知识
- python中的nmap模块(编写扫描器)
- 浅谈“异常信息泄露(应用程序错误)”
- 分享 | 基于图像分类网络ResNet50_vd实现桃子分类
- 【每日一题】涂色PAINT
- Idea创建一个java项目
- vs进行cuda编程失败,报错“the provided PTX was compiled with an unsupported toolchain.”
- 云计算之云计算架构图
- 实现上传图片-生成唯一的名字
- 字符串与Date类型相互转换
- ios学习之旅--多态与点语法
- 2019牛客暑期多校训练营(第一场)E.ABBA
热门文章
- Sqlite3 stmt 机制操作
- SpringSecurity自定义多Provider时提示No AuthenticationProvider found for问题的解决方案与原理(四)
- Android自定义View,画一个好看带延长线的饼状图
- 逻辑谬误_跟上的谬误
- android ppt 转图片显示不全,ppt转pdf图片显示不全怎么办 这两种方法供您参考
- USB大容量存储设备禁用后恢复不了问题解决方案
- wxpy 扫码登录微信报错 KeyError: pass_ticket(网页版微信登录失败)
- 锁定计算机屏幕的快捷键是什么,锁住电脑屏幕的快捷键_打开电脑屏幕的快捷键...
- 使用ARM芯片的小型NAS设备的一次存储故障的检修
- sinx泰勒展开_利用泰勒公式求极限,函数需要展开到第几阶?