前面介绍了图像处理中的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’键则保存图片到磁盘中。

[cpp] view plaincopy
  1. // 鼠标绘图
  2. //By MoreWindows (http://blog.csdn.net/MoreWindows)
  3. #include <opencv2/opencv.hpp>
  4. using namespace std;
  5. #pragma comment(linker, "/subsystem:\"windows\" /entry:\"mainCRTStartup\"")
  6. const char *pstrWindowsMouseDrawTitle = "鼠标绘图(http://blog.csdn.net/MoreWindows)";
  7. // 鼠标消息的回调函数
  8. void on_mouse(int event, int x, int y, int flags, void* param)
  9. {
  10. static bool s_bMouseLButtonDown = false;
  11. static CvPoint s_cvPrePoint = cvPoint(0, 0);
  12. switch (event)
  13. {
  14. case CV_EVENT_LBUTTONDOWN:
  15. s_bMouseLButtonDown = true;
  16. s_cvPrePoint = cvPoint(x, y);
  17. break;
  18. case  CV_EVENT_LBUTTONUP:
  19. s_bMouseLButtonDown = false;
  20. break;
  21. case CV_EVENT_MOUSEMOVE:
  22. if (s_bMouseLButtonDown)
  23. {
  24. CvPoint cvCurrPoint = cvPoint(x, y);
  25. cvLine((IplImage*)param, s_cvPrePoint, cvCurrPoint, CV_RGB(0, 0, 20), 3);
  26. s_cvPrePoint = cvCurrPoint;
  27. cvShowImage(pstrWindowsMouseDrawTitle, (IplImage*)param);
  28. }
  29. break;
  30. }
  31. }
  32. int main()
  33. {
  34. const int MAX_WIDTH = 500, MAX_HEIGHT = 400;
  35. const char *pstrSaveImageName = "MouseDraw.jpg";
  36. IplImage *pSrcImage =  cvCreateImage(cvSize(MAX_WIDTH, MAX_HEIGHT), IPL_DEPTH_8U, 3);
  37. cvSet(pSrcImage, CV_RGB(255, 255, 255)); //可以用cvSet()将图像填充成白色
  38. cvNamedWindow(pstrWindowsMouseDrawTitle, CV_WINDOW_AUTOSIZE);
  39. cvShowImage(pstrWindowsMouseDrawTitle, pSrcImage);
  40. cvSetMouseCallback(pstrWindowsMouseDrawTitle, on_mouse, (void*)pSrcImage);
  41. int c;
  42. do{
  43. c = cvWaitKey(0);
  44. switch ((char)c)
  45. {
  46. case 'r':
  47. cvSet(pSrcImage, CV_RGB(255, 255, 255));
  48. cvShowImage(pstrWindowsMouseDrawTitle, pSrcImage);
  49. break;
  50. case 's':
  51. cvSaveImage(pstrSaveImageName, pSrcImage);
  52. break;
  53. }
  54. }while (c > 0 && c != 27);
  55. cvDestroyWindow(pstrWindowsMouseDrawTitle);
  56. cvReleaseImage(&pSrcImage);
  57. return 0;
  58. }

运行效果如下图所示:

画一些复杂的图画也可以。

瓶花:

玫瑰:

米老鼠:

呵呵,由于程序只能画黑白图像,要能支持彩色画笔估计画图效果会好的多。

如果我们要写自己写的好OpenCV分享给其它人使用应该怎么做了?请看《【OpenCV入门指南】第十二篇分享OpenCV程序》

【OpenCV入门指南】第十一篇 鼠标绘图相关推荐

  1. 【OpenCV入门指南】第九篇 灰度直方图均衡化

    <OpenCV入门指南>系列文章地址: http://blog.csdn.net/morewindows/article/category/1291764 转载请标明出处,原文地址:htt ...

  2. 【OpenCV入门指南】第十篇 彩色直方图均衡化

    上一篇<OpenCV第十篇灰度直方图均衡化>介绍了灰度图像的直方图均衡化,实际生活中,肯定还是彩色图像用的最多,因此本篇介绍对彩色图像进行直方图均衡化.这样可以让大家直方图均衡化对图像增强 ...

  3. 【OpenCV入门指南】第十三篇 人脸检测

    原文出处:http://blog.csdn.net/MoreWindows/article/details/8426318#t2 本篇介绍图像处理与模式识别中最热门的一个领域--人脸检测(人脸识别). ...

  4. 【OpenCV入门指南】第五篇轮廓检测 下

    上一篇<[OpenCV入门指南]第五篇轮廓检测上>介绍了cvFindContours函数和cvDrawContours函数,并作了一个简单的使用示范.本篇将展示一个实例,让大家对轮廓检测有 ...

  5. 【OpenCV入门指南】第五篇 轮廓检测 上

    <[OpenCV入门指南]第三篇Canny边缘检测>中介绍了边缘检测,本篇介绍轮廓检测,轮廓检测的原理通俗的说就是掏空内部点,比如原图中有3*3的矩形点.那么就可以将中间的那一点去掉. 在 ...

  6. 【OpenCV入门教程之十一】 形态学图像处理(二):开运算、闭运算、形态学梯度、顶帽、黑帽合辑

    本系列文章由@浅墨_毛星云 出品,转载请注明出处. 文章链接: http://blog.csdn.net/poem_qianmo/article/details/23184547 作者:毛星云(浅墨) ...

  7. opencv程序十一:鼠标绘图

    根据第一篇创建工程并添加两个文件 程序如下: // 17MouseDraw.cpp : 定义控制台应用程序的入口点. //鼠标绘图,按下'r'键可以重新绘图,按下's'键则保存图片到磁盘中#inclu ...

  8. agx 安装ros opencv_史上最全的OpenCV入门教程!这篇够你学习半个月了!万字长文入门...

    一.Python OpenCV 入门 欢迎阅读系列教程,内容涵盖 OpenCV,它是一个图像和视频处理库,包含 C ++,C,Python 和 Java 的绑定. OpenCV 用于各种图像和视频分析 ...

  9. 史上最全的OpenCV入门教程!这篇够你学习半个月了!万字长文入门

    推荐下我自己建的人工智能Python学习群:[809160367],群里有我整理的一份关于pytorch.python基础,图像处理opencv\自然语言处理.机器学习.数学基础等资源库,想学习人工智 ...

  10. 数位dp模板 最高位最低位_无纸化办公入门指南(数位板篇)

    居家办公的这段时间,你们有没有遇到无纸化办公的问题? 作为一名编辑,在我社规定不能寄纸稿的情况下,看电子稿成了常态.如果是word版尚且可以批注,不影响工作效率.但如果是PDF呢?怎样保证改稿的效率? ...

最新文章

  1. python获取精彩视频_python获取莫视频网站视频
  2. Transact-SQL 示例 - 查询某个数据库内的所有表的记录行数及其总和
  3. STM32F1迷你板外部中断
  4. ACM入门之【离散化】
  5. 【AI初识境】深度学习中常用的损失函数有哪些?
  6. 文献综述写作之“结构内容”
  7. DNS劫持DNSmasq详细解析及详细配置
  8. utf-8编码用于asp出现乱码的问题--从数据库调用的是乱码
  9. spss多元线性回归散点图_案例分析 | 多元线性回归及SPSS操作
  10. Atitit. Atiposter 发帖机 新特性 poster new feature v11  .docx
  11. MVC Area领域处理以及T4MVC的使用
  12. Web容器、Servlet容器、Spring容器、SpringMVC容器之间的关系
  13. wps如何删除空白页?wps删除空白页的方法
  14. eclipse代码补全、代码提示及防空格自动补全
  15. Tkinter登陆界面设计
  16. 尚学堂Java全套资料百度云,Java注解和反射
  17. Warshell算法实现
  18. textarea 手机端无法换行_在某一些手机的安卓浏览器上textarea标签的placeholder不自动换行的解决方法...
  19. 图像的形态学处理总结
  20. 新意互动董事长兼CEO曲伟海出席2021中国企业家博鳌论坛

热门文章

  1. [简单]1.宝石和石头
  2. Loadrunner 11检查点使用方法总结
  3. [转]asp导入excel数据到sql 2000
  4. 【常见错误】--Nltk使用错误
  5. iOS推送机制下AppDelegate中代理函数执行顺序
  6. 混合使用UITabBarController和UINavigationController
  7. BaseAdapter的逗逼、普通、文艺写法
  8. 编写led驱动及其实验过程
  9. POST 方式上传图片
  10. 浅谈前端H5自定义分享实现方法