opencv程序十一:鼠标绘图
根据第一篇创建工程并添加两个文件
程序如下:
// 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程序十一:鼠标绘图相关推荐
- python鼠标绘图_python 基于opencv 实现一个鼠标绘图小程序
需求 在画布上用鼠标画图,可以画圆或矩形,按m键在两种模式下切换.左键按下时开始画图,移动到哪儿画到哪儿,左键释放时结束画图. 实现思想 用鼠标画图:需要定义鼠标的回调函数mouse_event 画圆 ...
- opencv 实现一个鼠标绘图小程序
需求 在画布上用鼠标画图,可以画圆或矩形,按m键在两种模式下切换.左键按下时开始画图,移动到哪儿画到哪儿,左键释放时结束画图. 实现思想 用鼠标画图:需要定义鼠标的回调函数mouse_event 画圆 ...
- java 鼠标绘图,教您如何用JAVA程序实现鼠标绘图
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 import java.awt.Color: import java.awt.Frame: import java.awt.Graphics: impor ...
- java鼠标绘制,教您如何用JAVA程序实现鼠标绘图
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 import java.awt.Color: import java.awt.Frame: import java.awt.Graphics: impor ...
- OpenCV学习笔记(二十一)——绘图函数core OpenCV学习笔记(二十二)——粒子滤波跟踪方法 OpenCV学习笔记(二十三)——OpenCV的GUI之凤凰涅槃Qt OpenCV学习笔记(二十
OpenCV学习笔记(二十一)--绘图函数core 在图像中,我们经常想要在图像中做一些标识记号,这就需要绘图函数.OpenCV虽然没有太优秀的GUI,但在绘图方面还是做得很完整的.这里就介绍一下相关 ...
- opencv 鼠标绘图
程序如下: // 17MouseDraw.cpp : 定义控制台应用程序的入口点. //鼠标绘图,按下'r'键可以重新绘图,按下's'键则保存图片到磁盘中 #include "stdafx. ...
- Opencv做鼠标绘图
现在已经可以显示一张图像给用户,但是更加希望给用户互动性强一点内容--用鼠标绘图.其实我已经知道使用cvWaitKey()来捕捉单次用户触发事件,下一步则需要做的是如何捕捉以及响应鼠标事件.为了响应鼠 ...
- 几个简单的OpenCV程序
OpenCV官网:https://opencv.org/ 百度百科 OpenCV是一个基于BSD许可(开源)发行的跨平台计算机视觉库,可以运行在Linux.Windows.Android和Mac OS ...
- 《快速掌握PyQt5》第三十一章 绘图与打印
第三十一章 绘图与打印 31.1 画笔.画刷和字体 31.2 利用双缓冲技术实现实时绘图 31.3 解决重影问题 31.4 打印 31.5 小结 绘图操作主要通过QPainter类来进行,通过该类我们 ...
最新文章
- 计算机网络体系小知识
- Dictionary Aizu - ALDS1_4_C
- Java中集合(一)Collection 、ListE 、ArrayListE
- HihoCoder - 1829 Tomb Raider(暴力)
- code1928: 日期差值 技巧模拟
- 单链表排序(冒泡排序)(C语言)
- python 图形_Python图形数据
- pandas-事例练习
- 怎么让打印出来表格的纸下面显示页数_4个使用频率较高的Excel打印技巧,办公室打印文件时常常会用到!...
- MySQL教程(十一)—— 操作数据表中的记录
- oracle 循环select查询的结构集,执行insert到指定表保存
- Runner站立会议04
- Weblogic ./startWebLogic.sh Error 解决
- abaqus一维固结模拟
- 子母钟运用在什么领域,设备如何调试,天穹告诉你子母钟系统授时的意义
- 解决关于pycharm启动时持续Updating Indices的问题
- PS图片上传图片 同时生成微缩图
- 计算机毕业设计 SSM+Vue房屋出租系统 房屋租赁合同信息管理系统 房屋租售管理系统Java Vue MySQL数据库 远程调试 代码讲解
- 那年我们也曾高三——纪录片《高三》真实记录高三生活
- 关于STC单片机“假死”状态的判别和处理方法
热门文章
- 在arm Cortex-A9开发板移植rtl8821au无线网卡并实现与外网通信
- 小白在线要饭系统源码
- 数字人民币问答-什么是数字人名币?
- Android开机动画bootanimation
- NLP实战:财经新闻热点发现
- 【08月07日】A股滚动市盈率PE最低排名
- 【重大突破】——移动端——如何手机端屏蔽掉网站,【小技巧】戒应用AppDetox,一个可以屏蔽管理APP的自律软件,马克保存
- ZOJ3587 Marlon's String
- #边学边记 必修4 高项:对事的管理 第5章 项目成本管理 之 项目成本估算
- wordpress v3.3.1空间上传php,怎么上传wordpress到虚拟主机