Opencv之鼠标响应setMouseCallback()的用法
来源:互联网 发布:英伟达优化软件 编辑:程序博客网 时间:2024/05/16 17:23
平时在写代码时可能用到鼠标在图上做标记等其他作用,opencv主要用setMouseCallback()这个函数,下面来讲解:
一、setMouseCallback()
- void setMousecallback(const string& winname, MouseCallback onMouse, void* userdata=0)
- winname:窗口的名字
- onMouse:鼠标响应函数,回调函数。指定窗口里每次鼠标时间发生的时候,被调用的函数指针。 这个函数的原型应该为void on_Mouse(int event, int x, int y, int flags, void* param);
- userdate:传给回调函数的参数
- void on_Mouse(int event, int x, int y, int flags, void* param);
- event是 CV_EVENT_*变量之一
- x和y是鼠标指针在图像坐标系的坐标(不是窗口坐标系)
- flags是CV_EVENT_FLAG的组合, param是用户定义的传递到setMouseCallback函数调用的参数。
附常用的event:
#defineCV_EVENT_MOUSEMOVE
#defineCV_EVENT_LBUTTONDOWN
#defineCV_EVENT_RBUTTONDOWN
#defineCV_EVENT_LBUTTONUP
#defineCV_EVENT_RBUTTONUP
和标志位flags有关的:
#defineCV_EVENT_FLAG_LBUTTON
二、程序一(画直线)
用if()else()方法:
- #include<opencv2/opencv.hpp>
- #include<iostream>
- using namespace std;
- using namespace cv;
- #define WINDOW "原图"
- Mat g_srcImage,g_dstImage;
- Point previousPoint;
- bool P = false;
- void On_mouse(int event, int x, int y, int flags, void*);
- int main()
- {
- g_srcImage = imread("D://vvoo//face.jpg", 1);
- imshow(WINDOW, g_srcImage);
- setMouseCallback(WINDOW, On_mouse, 0);
- waitKey(0);
- return 0;
- }
- void On_mouse(int event, int x, int y, int flags, void*)
- {
- /*if (event == EVENT_LBUTTONUP ||!( flags&EVENT_FLAG_LBUTTON))
- {
- previousPoint = Point(-1, -1);
- }*/
- if (event == EVENT_LBUTTONDOWN)
- {
- previousPoint = Point(x, y);
- }
- else if (event == EVENT_MOUSEMOVE && (flags&EVENT_FLAG_LBUTTON))
- {
- Point pt(x, y);
- line(g_srcImage, previousPoint, pt, Scalar(0,0,255), 2, 5, 0);
- previousPoint = pt;
- imshow(WINDOW, g_srcImage);
- }
- }
参考switch()方法:
- void On_mouse(int event, int x, int y, int flags, void*)
- {
- switch (event)
- {
- case EVENT_LBUTTONUP:
- {
- P = false;
- }
- break;
- case EVENT_LBUTTONDOWN:
- {
- previousPoint = Point(x, y);
- P = true;
- }
- break;
- case EVENT_MOUSEMOVE :
- {
- if(P)
- {
- Point pt(x, y);
- line(g_srcImage, previousPoint, pt, Scalar(0,0,255), 2, 5, 0);
- previousPoint = pt;
- imshow(WINDOW, g_srcImage);
- }
- }
- break;
- }
- }
两者的实现方法不同,但是结果都是一样的,方法一没有用到EVENT_LBUTTONUP这个鼠标左键按下响应。
结果:
二、程序2(画矩形)
- #include<opencv2/opencv.hpp>
- #include<iostream>
- using namespace std;
- using namespace cv;
- Rect select;
- bool select_flag = false;
- Mat img, showImg;
- void A_on_Mouse(int event, int x, int y, int flags, void*param)//实现画矩形框
- {
- Point p1, p2;
- if (event == EVENT_LBUTTONDOWN)
- {
- select.x = x;
- select.y = y;
- select_flag = true;
- }
- else if (select_flag &&event == EVENT_MOUSEMOVE)
- {
- img.copyTo(showImg);
- p1 = Point(select.x, select.y);
- p2 = Point(x, y);
- rectangle(showImg, p1, p2, Scalar(0, 255, 0), 2);
- imshow("img", showImg);
- }
- else if (select_flag && event == EVENT_LBUTTONUP)
- {
- select_flag = false;
- }
- }
- void B_on_Mouse(int event, int x, int y, int flags, void*param)//实现画矩形框并截图
- {
- Point p1, p2;
- switch (event)
- {
- case EVENT_LBUTTONDOWN:
- {
- select.x = x;
- select.y = y;
- select_flag = true;
- }
- break;
- case EVENT_MOUSEMOVE:
- {
- if (select_flag)
- {
- img.copyTo(showImg);
- p1 = Point(select.x, select.y);
- p2 = Point(x, y);
- rectangle(showImg, p1, p2, Scalar(0, 255, 0), 2);
- imshow("img", showImg);
- }
- }
- break;
- case EVENT_LBUTTONUP:
- {
- //显示框出的ROI
- //改成Rect roi = Rect(p1, p2);为什么不对?
- Rect roi = Rect(Point(select.x, select.y), Point(x, y));
- if (roi.width && roi.height)//点一下时会没有反应
- {
- Mat roiImg = img(roi);
- imshow("roi", roiImg);
- }
- select_flag = false;
- }
- break;
- }
- }
- int main()
- {
- img = imread("D://vvoo//face.jpg", 1);
- showImg = img.clone();
- select.x = select.y = 0;
- imshow("img", showImg);
- while (1)
- {
- int key = waitKey(10);
- switch (key)
- {
- case 'a':
- setMouseCallback("img", A_on_Mouse, 0);
- break;
- case 'b':
- setMouseCallback("img", B_on_Mouse, 0);
- break;
- }
- if (key == 27||key=='q')
- break;
- }
- waitKey(0);
- return 0;
- }
根据按键实现两种功能,这里只截图了第二种画矩形框并把它截图功能:
三、参考资料
1.http://blog.csdn.net/maryhuan/article/details/13017697
2.http://www.xuebuyuan.com/1528309.html
3.http://www.zybang.com/question/151ef07151a0e64dd54811485a418dcd.html
阅读全文
0 0
- Opencv之鼠标响应setMouseCallback()的用法
- Opencv之鼠标响应setMouseCallback()的用法
- OpenCV学习笔记之鼠标响应回调函数setMouseCallback
- Opencv函数setMouseCallback鼠标事件响应
- opencv中setMousecallback的用法
- opencv中setMousecallback的用法
- opencv中setMousecallback的用法
- opencv中setMousecallback的用法
- opencv中setMousecallback的用法
- opencv 鼠标操作 setMouseCallback
- opencv 3.0 鼠标操作 setMouseCallback
- OpenCV I_07鼠标画笔 setMouseCallback()
- opencv的SetMouseCallback函数
- opencv鼠标操作setMouseCallback()与on_MouseHandle()
- OpenCV之鼠标响应事件
- opencv 鼠标操作SetMouseCallback()函数传递用户定义参数的问题
- 利用OpenCV鼠标事件设置函数setMouseCallback显示图像像素的RGB、HSV和坐标值!
- OpenCV中关于SetMouseCallback的解释
- QA问答系统中的深度学习技术实现
- 第十二周【项目一-Prim算法的验证】
- Java单链表、双端链表、有序链表实现
- 第12周项目5-拓扑排序算法验证
- Android开发,so文件报错 No implementation found for XXX
- Opencv之鼠标响应setMouseCallback()的用法
- Matlab连接数据库ACCESS数据库
- SQLServer两张表筛选相同数据和不同数据
- JAVA语言如何进行异常处理,关键字:throws,throw,try,catch,finally分别代表什么意义?在try块中可以抛出异常吗?
- 【移动】使用输入法的"搜索"按钮
- WebSocket协议实时通信技术原理
- main函数的输入参数
- chengxu
- zookeeper实现注册中心(demo)