【OpenCV入门指南】第十一篇 鼠标绘图
前面介绍了图像处理中的Canny边缘检测、轮廓检测、直方图以及直方图均衡化。本篇介绍个互动性强一点内容——用鼠标绘图。在OpenCV中进行鼠标绘图也是非常简易的,主要使用到cvSetMouseCallback函数,下请看介绍。
一.关键函数
1.1 cvSetMouseCallback
函数功能:设置处理鼠标消息的回调函数
函数原型:
/* assign callback for mouse events */
CVAPI(void) cvSetMouseCallback(
const char* window_name,
CvMouseCallback on_mouse,
void* param CV_DEFAULT(NULL)
);
函数说明:
第一个参数表示窗口名称。
第二个参数表示鼠标消息的消息处理函数。
第三个参数表示用户定义传入鼠标指定消息处理函数的参数。
1.2 CvMouseCallback
函数功能:鼠标消息的回调函数
函数原型:
typedef void (CV_CDECL *CvMouseCallback )(int event, int x, int y, int flags, void* param);
函数说明:
第一个参数表示鼠标消息类型,取值如下:
enum
{
CV_EVENT_MOUSEMOVE =0,
CV_EVENT_LBUTTONDOWN =1,
CV_EVENT_RBUTTONDOWN =2,
CV_EVENT_MBUTTONDOWN =3,
CV_EVENT_LBUTTONUP =4,
CV_EVENT_RBUTTONUP =5,
CV_EVENT_MBUTTONUP =6,
CV_EVENT_LBUTTONDBLCLK =7,
CV_EVENT_RBUTTONDBLCLK =8,
CV_EVENT_MBUTTONDBLCLK =9
};
第二,三个参数表示鼠标的坐标。
第四个参数表示附加事件,取值如下:
enum
{
CV_EVENT_FLAG_LBUTTON =1,
CV_EVENT_FLAG_RBUTTON =2,
CV_EVENT_FLAG_MBUTTON =4,
CV_EVENT_FLAG_CTRLKEY =8,
CV_EVENT_FLAG_SHIFTKEY =16,
CV_EVENT_FLAG_ALTKEY =32
};
第五个参数即设置cvSetMouseCallback()中将接收到的参数。
二.示例程序代码
代码示范如下,按下‘r’键可以重新绘图,按下‘s’键则保存图片到磁盘中。
- // 鼠标绘图
- //By MoreWindows (http://blog.csdn.net/MoreWindows)
- #include <opencv2/opencv.hpp>
- using namespace std;
- #pragma comment(linker, "/subsystem:\"windows\" /entry:\"mainCRTStartup\"")
- const char *pstrWindowsMouseDrawTitle = "鼠标绘图(http://blog.csdn.net/MoreWindows)";
- // 鼠标消息的回调函数
- void on_mouse(int event, int x, int y, int flags, void* param)
- {
- static bool s_bMouseLButtonDown = false;
- static CvPoint s_cvPrePoint = cvPoint(0, 0);
- switch (event)
- {
- case CV_EVENT_LBUTTONDOWN:
- s_bMouseLButtonDown = true;
- s_cvPrePoint = cvPoint(x, y);
- break;
- case CV_EVENT_LBUTTONUP:
- s_bMouseLButtonDown = false;
- break;
- case CV_EVENT_MOUSEMOVE:
- if (s_bMouseLButtonDown)
- {
- CvPoint cvCurrPoint = cvPoint(x, y);
- cvLine((IplImage*)param, s_cvPrePoint, cvCurrPoint, CV_RGB(0, 0, 20), 3);
- s_cvPrePoint = cvCurrPoint;
- cvShowImage(pstrWindowsMouseDrawTitle, (IplImage*)param);
- }
- break;
- }
- }
- int main()
- {
- const int MAX_WIDTH = 500, MAX_HEIGHT = 400;
- const char *pstrSaveImageName = "MouseDraw.jpg";
- IplImage *pSrcImage = cvCreateImage(cvSize(MAX_WIDTH, MAX_HEIGHT), IPL_DEPTH_8U, 3);
- cvSet(pSrcImage, CV_RGB(255, 255, 255)); //可以用cvSet()将图像填充成白色
- cvNamedWindow(pstrWindowsMouseDrawTitle, CV_WINDOW_AUTOSIZE);
- cvShowImage(pstrWindowsMouseDrawTitle, pSrcImage);
- cvSetMouseCallback(pstrWindowsMouseDrawTitle, on_mouse, (void*)pSrcImage);
- int c;
- do{
- c = cvWaitKey(0);
- switch ((char)c)
- {
- case 'r':
- cvSet(pSrcImage, CV_RGB(255, 255, 255));
- cvShowImage(pstrWindowsMouseDrawTitle, pSrcImage);
- break;
- case 's':
- cvSaveImage(pstrSaveImageName, pSrcImage);
- break;
- }
- }while (c > 0 && c != 27);
- cvDestroyWindow(pstrWindowsMouseDrawTitle);
- cvReleaseImage(&pSrcImage);
- return 0;
- }
运行效果如下图所示:
画一些复杂的图画也可以。
瓶花:
玫瑰:
米老鼠:
呵呵,由于程序只能画黑白图像,要能支持彩色画笔估计画图效果会好的多。
如果我们要写自己写的好OpenCV分享给其它人使用应该怎么做了?请看《【OpenCV入门指南】第十二篇分享OpenCV程序》
【OpenCV入门指南】第十一篇 鼠标绘图相关推荐
- 【OpenCV入门指南】第九篇 灰度直方图均衡化
<OpenCV入门指南>系列文章地址: http://blog.csdn.net/morewindows/article/category/1291764 转载请标明出处,原文地址:htt ...
- 【OpenCV入门指南】第十篇 彩色直方图均衡化
上一篇<OpenCV第十篇灰度直方图均衡化>介绍了灰度图像的直方图均衡化,实际生活中,肯定还是彩色图像用的最多,因此本篇介绍对彩色图像进行直方图均衡化.这样可以让大家直方图均衡化对图像增强 ...
- 【OpenCV入门指南】第十三篇 人脸检测
原文出处:http://blog.csdn.net/MoreWindows/article/details/8426318#t2 本篇介绍图像处理与模式识别中最热门的一个领域--人脸检测(人脸识别). ...
- 【OpenCV入门指南】第五篇轮廓检测 下
上一篇<[OpenCV入门指南]第五篇轮廓检测上>介绍了cvFindContours函数和cvDrawContours函数,并作了一个简单的使用示范.本篇将展示一个实例,让大家对轮廓检测有 ...
- 【OpenCV入门指南】第五篇 轮廓检测 上
<[OpenCV入门指南]第三篇Canny边缘检测>中介绍了边缘检测,本篇介绍轮廓检测,轮廓检测的原理通俗的说就是掏空内部点,比如原图中有3*3的矩形点.那么就可以将中间的那一点去掉. 在 ...
- 【OpenCV入门教程之十一】 形态学图像处理(二):开运算、闭运算、形态学梯度、顶帽、黑帽合辑
本系列文章由@浅墨_毛星云 出品,转载请注明出处. 文章链接: http://blog.csdn.net/poem_qianmo/article/details/23184547 作者:毛星云(浅墨) ...
- opencv程序十一:鼠标绘图
根据第一篇创建工程并添加两个文件 程序如下: // 17MouseDraw.cpp : 定义控制台应用程序的入口点. //鼠标绘图,按下'r'键可以重新绘图,按下's'键则保存图片到磁盘中#inclu ...
- agx 安装ros opencv_史上最全的OpenCV入门教程!这篇够你学习半个月了!万字长文入门...
一.Python OpenCV 入门 欢迎阅读系列教程,内容涵盖 OpenCV,它是一个图像和视频处理库,包含 C ++,C,Python 和 Java 的绑定. OpenCV 用于各种图像和视频分析 ...
- 史上最全的OpenCV入门教程!这篇够你学习半个月了!万字长文入门
推荐下我自己建的人工智能Python学习群:[809160367],群里有我整理的一份关于pytorch.python基础,图像处理opencv\自然语言处理.机器学习.数学基础等资源库,想学习人工智 ...
- 数位dp模板 最高位最低位_无纸化办公入门指南(数位板篇)
居家办公的这段时间,你们有没有遇到无纸化办公的问题? 作为一名编辑,在我社规定不能寄纸稿的情况下,看电子稿成了常态.如果是word版尚且可以批注,不影响工作效率.但如果是PDF呢?怎样保证改稿的效率? ...
最新文章
- python获取精彩视频_python获取莫视频网站视频
- Transact-SQL 示例 - 查询某个数据库内的所有表的记录行数及其总和
- STM32F1迷你板外部中断
- ACM入门之【离散化】
- 【AI初识境】深度学习中常用的损失函数有哪些?
- 文献综述写作之“结构内容”
- DNS劫持DNSmasq详细解析及详细配置
- utf-8编码用于asp出现乱码的问题--从数据库调用的是乱码
- spss多元线性回归散点图_案例分析 | 多元线性回归及SPSS操作
- Atitit. Atiposter 发帖机 新特性 poster new feature v11 .docx
- MVC Area领域处理以及T4MVC的使用
- Web容器、Servlet容器、Spring容器、SpringMVC容器之间的关系
- wps如何删除空白页?wps删除空白页的方法
- eclipse代码补全、代码提示及防空格自动补全
- Tkinter登陆界面设计
- 尚学堂Java全套资料百度云,Java注解和反射
- Warshell算法实现
- textarea 手机端无法换行_在某一些手机的安卓浏览器上textarea标签的placeholder不自动换行的解决方法...
- 图像的形态学处理总结
- 新意互动董事长兼CEO曲伟海出席2021中国企业家博鳌论坛