




免费预览已结束,剩余1页可下载查看
下载本文档
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
基础学习笔记之opencv(5):实现鼠标选定矩形框opencv编写程序中,用鼠标选定矩形框经常用到。编程时看似很简单的逻辑思路,如果对opencv中的Rect不是很了解的话,那实现的效果就不是特别理想,比如说虽然我们习惯性用鼠标从左上到右下选择,但是偶尔也会从左下到右上选择等等开始自己实现这个功能后,发现写的代码比较繁琐,if语句太多。后面看了opencv的例程后,感觉它的代码效率非常高。下面就是用来练习下的。环境:opencv2.3.1+vs2010功能:打开摄像头,捕捉视频图像,用鼠标选定视频区域(支持各种选择习惯)。代码和注释如下: 1 #include stdafx.h 2 #include opencv2/imgproc/imgproc.hpp 3 #include 4 #include 5 #include 6 #include 7 8 using namespace cv; 9 using namespace std;10 Rect select;11 bool select_flag=false;12 Point origin;13 Mat frame;14 15 /*/16 /* 如果采用这个onMouse()函数的话,则只能画出从左上到右下,或者从右下到左上的矩形框 */17 /*/18 /void onMouse(int event,int x,int y,int,void*)19 /20 / if(event=CV_EVENT_LBUTTONDOWN)21 / 22 / select.x=x;23 / select.y=y;24 / tracking=false;25 / 26 / else if(event=CV_EVENT_LBUTTONUP)27 / 28 / select.width=x-select.x;/以下2行计算出来的值要么都大于0,要么都小于029 / select.height=y-select.y;30 / tracking=true;/左键完后,开始跟踪31 / 32 /33 34 /*/35 /* 如果采用这个onMouse()函数的话,则可以画出鼠标拖动矩形框的4种情形 */36 /*/37 void onMouse(int event,int x,int y,int,void*)38 39 /Point origin;/不能在这个地方进行定义,因为这是基于消息响应的函数,执行完后origin就释放了,所以达不到效果。40 if(select_flag)41 42 select.x=MIN(origin.x,x);/不一定要等鼠标弹起才计算矩形框,而应该在鼠标按下开始到弹起这段时间实时计算所选矩形框43 select.y=MIN(origin.y,y);44 select.width=abs(x-origin.x);/算矩形宽度和高度45 select.height=abs(y-origin.y);46 select&=Rect(0,0,frame.cols,frame.rows);/保证所选矩形框在视频显示区域之内47 48 if(event=CV_EVENT_LBUTTONDOWN)49 50 select_flag=true;/鼠标按下的标志赋真值51 origin=Point(x,y);/保存下来单击是捕捉到的点52 select=Rect(x,y,0,0);/这里一定要初始化,宽和高为(0,0)是因为在opencv中Rect矩形框类内的点是包含左上角那个点的,但是不含右下角那个点53 54 else if(event=CV_EVENT_LBUTTONUP)55 56 select_flag=false;57 58 59 60 int main(int argc, unsigned char* argv)61 62 char c;63 64 /打开摄像头65 VideoCapture cam(0);66 if (!cam.isOpened()67 return -1;68 69 /建立窗口70 namedWindow(camera,1);/显示视频原图像的窗口71 72 /捕捉鼠标73 setMouseCallback(camera,onMouse,0);74 75 while(1)76 77 /读取一帧图像78 camframe;79 if(frame.empty()80 return -1;81 82 /画出矩形框83 rectangle(frame,select,Scalar(255,0,0),3,8,0);/能够实时显示在画矩形窗口时的痕迹84 85 /显示视频图片到窗口86 imshow(camera,frame);87 88 / select.zeros();89 /键盘响应90 c=(char)waitKey(20);91 if(27=c)/ESC键92 return -1;93 94 95 return 0;96 程序如下:cpp view plaincopyprint?1. / drawBox.cpp : 定义控制台应用程序的入口点。 2. / 3.4. #include stdafx.h 5. #include cv.h 6. #include highgui.h 7.8.9. void my_mouse_callback( 10. int event,int x,int y,int flags,void *param); 11.12. CvRect box; 13. bool drawing_box=false; 14. void draw_box(IplImage *img, CvRect rect) 15. 16. cvRectangle(img, 17. cvPoint(box.x,box.y), 18. cvPoint(box.x+box.width,box.y+box.height), 19. cvScalar(0xff,0x00,0x00) /*red*/ 20. ); 21. 22.23.24. int _tmain(int argc, char* argv) 25. 26. box=cvRect(-1,-1,0,0); 27. IplImage *image=cvCreateImage( 28. cvSize(200,200), 29. IPL_DEPTH_8U, 30. 3 31. ); 32. cvZero(image); 33. IplImage *temp=cvCloneImage(image); 34. cvNamedWindow(Box Example); 35. cvSetMouseCallback( 36. Box Example, 37. my_mouse_callback, 38. (void *)image 39. ); 40. while(1) 41. 42. cvCopyImage(image,temp); 43. if(drawing_box)draw_box(temp,box); 44. cvShowImage(Box Example,temp); 45. if(cvWaitKey(15)=27) break; 46. 47. cvReleaseImage(&image); 48. cvReleaseImage(&temp); 49. cvDestroyWindow(Box Example); 50. 51.52.53. void my_mouse_callback( 54. int event,int x,int y,int flags, void *param) 55. 56. IplImage *image=(IplImage *)param; 57. switch(event) 58. 59. case CV_EVENT_MOUSEMOVE: 60. if (drawing_box) 61. box.width=x-box.x; 62. box.height=y-box.y; 63. 64. 65. break; 66. case CV_EVENT_LBUTTONDOWN: 67. drawing_box=true; 68. box=cvRect(x,y,0,0); 69. 70. break; 71. case CV_EVENT_LBUTTONUP: 72. drawing_box=false
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 人教版PEP小学3年级下册英语Unit 6 教案(三)
- 西餐礼仪课件大班
- 七年级生物下册 4.4.1 流动的组织-血液教学设计 (新版)新人教版
- 泵房维修安装合同范本
- 5.2 社会历史的发展 课件高中政治统编版必修四哲学与文化
- 租赁产品授权合同范本
- 采购合同合同管理专业会议组织重点基础知识点
- 采购合同风险审计重点基础知识点
- 骨科护理临床总带教竞聘
- 医生劳动协议合同书二零二五年
- 针刀操作安全区带
- GA/T 922.2-2011安防人脸识别应用系统第2部分:人脸图像数据
- GA/T 543.5-2012公安数据元(5)
- 测量小灯泡的功率实验报告单
- 《绿色建筑概论》整套教学课件
- 证据法学李浩课件 第五章
- 图书馆建筑设计规范讲解课件
- 考研考博-英语-北京建筑大学考试押题卷含答案详解3
- 爱莲说-王崧舟
- 光伏支架安装施工协议
- 保定市县级地图PPT可编辑矢量行政区划(河北省)
评论
0/150
提交评论