根据第一篇创建工程并添加两个文件

程序如下:

// 17MouseDraw.cpp : 定义控制台应用程序的入口点。
//鼠标绘图,按下‘r’键可以重新绘图,按下‘s’键则保存图片到磁盘中#include "stdafx.h"
#include <opencv2/opencv.hpp>
using namespace std;
#pragma comment(linker, "/subsystem:\"windows\" /entry:\"mainCRTStartup\"")
const char *pstrWindowsMouseDrawTitle = "鼠标绘图";
// 鼠标消息的回调函数
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;
}

一.关键函数

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()中将接收到的参数。

运行效果如下图所示:

opencv程序十一:鼠标绘图相关推荐

  1. python鼠标绘图_python 基于opencv 实现一个鼠标绘图小程序

    需求 在画布上用鼠标画图,可以画圆或矩形,按m键在两种模式下切换.左键按下时开始画图,移动到哪儿画到哪儿,左键释放时结束画图. 实现思想 用鼠标画图:需要定义鼠标的回调函数mouse_event 画圆 ...

  2. opencv 实现一个鼠标绘图小程序

    需求 在画布上用鼠标画图,可以画圆或矩形,按m键在两种模式下切换.左键按下时开始画图,移动到哪儿画到哪儿,左键释放时结束画图. 实现思想 用鼠标画图:需要定义鼠标的回调函数mouse_event 画圆 ...

  3. java 鼠标绘图,教您如何用JAVA程序实现鼠标绘图

    该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 import java.awt.Color: import java.awt.Frame: import java.awt.Graphics: impor ...

  4. java鼠标绘制,教您如何用JAVA程序实现鼠标绘图

    该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 import java.awt.Color: import java.awt.Frame: import java.awt.Graphics: impor ...

  5. OpenCV学习笔记(二十一)——绘图函数core OpenCV学习笔记(二十二)——粒子滤波跟踪方法 OpenCV学习笔记(二十三)——OpenCV的GUI之凤凰涅槃Qt OpenCV学习笔记(二十

    OpenCV学习笔记(二十一)--绘图函数core 在图像中,我们经常想要在图像中做一些标识记号,这就需要绘图函数.OpenCV虽然没有太优秀的GUI,但在绘图方面还是做得很完整的.这里就介绍一下相关 ...

  6. opencv 鼠标绘图

    程序如下: // 17MouseDraw.cpp : 定义控制台应用程序的入口点. //鼠标绘图,按下'r'键可以重新绘图,按下's'键则保存图片到磁盘中 #include "stdafx. ...

  7. Opencv做鼠标绘图

    现在已经可以显示一张图像给用户,但是更加希望给用户互动性强一点内容--用鼠标绘图.其实我已经知道使用cvWaitKey()来捕捉单次用户触发事件,下一步则需要做的是如何捕捉以及响应鼠标事件.为了响应鼠 ...

  8. 几个简单的OpenCV程序

    OpenCV官网:https://opencv.org/ 百度百科 OpenCV是一个基于BSD许可(开源)发行的跨平台计算机视觉库,可以运行在Linux.Windows.Android和Mac OS ...

  9. 《快速掌握PyQt5》第三十一章 绘图与打印

    第三十一章 绘图与打印 31.1 画笔.画刷和字体 31.2 利用双缓冲技术实现实时绘图 31.3 解决重影问题 31.4 打印 31.5 小结 绘图操作主要通过QPainter类来进行,通过该类我们 ...

最新文章

  1. 计算机网络体系小知识
  2. Dictionary Aizu - ALDS1_4_C
  3. Java中集合(一)Collection 、ListE 、ArrayListE
  4. HihoCoder - 1829 Tomb Raider(暴力)
  5. code1928: 日期差值 技巧模拟
  6. 单链表排序(冒泡排序)(C语言)
  7. python 图形_Python图形数据
  8. pandas-事例练习
  9. 怎么让打印出来表格的纸下面显示页数_4个使用频率较高的Excel打印技巧,办公室打印文件时常常会用到!...
  10. MySQL教程(十一)—— 操作数据表中的记录
  11. oracle 循环select查询的结构集,执行insert到指定表保存
  12. Runner站立会议04
  13. Weblogic ./startWebLogic.sh Error 解决
  14. abaqus一维固结模拟
  15. 子母钟运用在什么领域,设备如何调试,天穹告诉你子母钟系统授时的意义
  16. 解决关于pycharm启动时持续Updating Indices的问题
  17. PS图片上传图片 同时生成微缩图
  18. 计算机毕业设计 SSM+Vue房屋出租系统 房屋租赁合同信息管理系统 房屋租售管理系统Java Vue MySQL数据库 远程调试 代码讲解
  19. 那年我们也曾高三——纪录片《高三》真实记录高三生活
  20. 关于STC单片机“假死”状态的判别和处理方法

热门文章

  1. 在arm Cortex-A9开发板移植rtl8821au无线网卡并实现与外网通信
  2. 小白在线要饭系统源码
  3. 数字人民币问答-什么是数字人名币?
  4. Android开机动画bootanimation
  5. NLP实战:财经新闻热点发现
  6. 【08月07日】A股滚动市盈率PE最低排名
  7. 【重大突破】——移动端——如何手机端屏蔽掉网站,【小技巧】戒应用AppDetox,一个可以屏蔽管理APP的自律软件,马克保存
  8. ZOJ3587 Marlon's String
  9. #边学边记 必修4 高项:对事的管理 第5章 项目成本管理 之 项目成本估算
  10. wordpress v3.3.1空间上传php,怎么上传wordpress到虚拟主机