Opencv做鼠标绘图
现在已经可以显示一张图像给用户,但是更加希望给用户互动性强一点内容——用鼠标绘图。其实我已经知道使用cvWaitKey()来捕捉单次用户触发事件,下一步则需要做的是如何捕捉以及响应鼠标事件。为了响应鼠标点击事件,首先必须创建一个回调函数,使鼠标点击事件时,Opencv可以调用这个函数。
一.关键函数
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()中将接收到的参数。
1.3 cvLine
函数原型:void cvLine(
CvArr* img,
CvPoint pt1,
CvPoint pt2,
CvScalar color,
int thickness=1,
int line_type=8,
int shift=0 );
- img 图像。
- pt1 线段的第一个端点。
- pt2 线段的第二个端点。
- color 线段的颜色。
- thickness 线段的粗细程度。
- line_type 线段的类型。
二.示例程序代码
代码示范如下,按下‘r’键可以重新绘图,按下‘s’键则保存图片到磁盘中。
#include <opencv2/opencv.hpp>
#include<iostream>using namespace std;
using namespace cv;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)//用switch来响应鼠标事件{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, 200, 0), 3);//开始连线s_cvPrePoint = cvCurrPoint;//把当前点作为下一次连线的起始点cvShowImage(pstrWindowsMouseDrawTitle, (IplImage*)param);}break;}
}int main()
{const int MAX_WIDTH = 600, MAX_HEIGHT = 500;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做鼠标绘图相关推荐
- python鼠标绘图_python opencv入门 鼠标绘图(4)
目标: 学习如何操作鼠标事件 学习cv2.setMouseCallback()函数 简单样例: 首先创建一个鼠标的回调函数,当鼠标事件触发时,该函数执行. 鼠标事件有很多种,比如左键右键,双击等等,该 ...
- python opencv入门 鼠标绘图(4)
内容来自OpenCV-Python Tutorials 自己翻译整理 目标: 学习如何操作鼠标事件 学习cv2.setMouseCallback()函数 简单样例: 首先创建一个鼠标的回调函数,当鼠标 ...
- python鼠标绘图_python 基于opencv 实现一个鼠标绘图小程序
需求 在画布上用鼠标画图,可以画圆或矩形,按m键在两种模式下切换.左键按下时开始画图,移动到哪儿画到哪儿,左键释放时结束画图. 实现思想 用鼠标画图:需要定义鼠标的回调函数mouse_event 画圆 ...
- opencv 鼠标绘图
程序如下: // 17MouseDraw.cpp : 定义控制台应用程序的入口点. //鼠标绘图,按下'r'键可以重新绘图,按下's'键则保存图片到磁盘中 #include "stdafx. ...
- opencv程序十一:鼠标绘图
根据第一篇创建工程并添加两个文件 程序如下: // 17MouseDraw.cpp : 定义控制台应用程序的入口点. //鼠标绘图,按下'r'键可以重新绘图,按下's'键则保存图片到磁盘中#inclu ...
- Pytorch快速搭建Alexnet实现手写英文字母识别+PyQt实现鼠标绘图
Pytorch快速搭建Alexnet实现手写英文字母识别+PyQt实现鼠标绘图 前言 一.案例要求 二.训练数据准备 1.下载手写英文字母数据集 2.构建自己的数据集 三.AlexNet实现 1.Al ...
- OpenCV I_07鼠标画笔 setMouseCallback()
目标 • 学习使用 OpenCV 处理鼠标事件 • 你将要学习的函数是:cv2.setMouseCallback() 鼠标事件 :cv2.setMouseCallback() cv2_EVENT_MO ...
- 整活--我是如何用OpenCV做了数字华容道游戏(附源码)
学更好的别人, 做更好的自己. --<微卡智享> 本文长度为3829字,预计阅读9分钟 前言 数字华容道,记得以前<最强大脑>上一个初赛题目,正好最近家里买了个数字华容道的玩具 ...
- Opencv做mark点寻边定位
Opencv做mark点寻边定位 通过mark点进行定位是很常见的项目,mark点就是在图上或者工件上设置一个标志性的mark点,在这里以圆点为例,如图: 这个原图是一个很大的板子,然后四个角分别有一 ...
最新文章
- 活动报名 | 因果科学与Casual AI读书会
- FEKO V7.0安装教程
- python学了基础之后方向_学习了解python基础后,该进去哪一个方向呢?
- Vue.js 作者尤雨溪:TypeScript 与 JavaScript 并行才切合实际!
- 18大产业的产业链全景图!(高清大图)
- 我的技术博客开通了!
- CentOS中MySQL5.6 数据库主从(Master/Slave)同步安装与配置详解
- 程序员常用的画图软件推荐
- c语言中(char)的用法,c语言中char的用法是什么意思.docx
- 初生牛犊不怕虎 golang入坑系列
- Visio绘制论文文献技术路线图流程图
- req和res的作用
- 中海国亚Java笔试题
- 使用java数据结构编写代码
- openpyxl中的load_workbook()函数
- 代码简短且隐蔽的后门木马
- You Only Look One-level Feature
- nginx pc 端和 手机移动端分离
- Get the 1,000- Foot View
- Pentadactyl使用技巧
热门文章
- Python 使用 opencv 库将BMP格式图片转RAW
- 基于 Java 的短视频实战项目
- MFC学习总结 (67个技巧)
- android刷机知识大全,安卓主流机型刷机基础科普 教你刷机不求人
- 基于深度学习的两种信源信道联合编码
- 推迟上市的网易云,逃不开在线音乐市场的“白刃战”
- 安卓开发SlidingDrawer实现抽屉效果
- w7计算机管理器怎么打开,windows7系统任务管理器怎么打开?快捷键是什么?
- 机械学习07: 常用统计分布:正态分布、T分布、卡方分布、F分布
- 计算机动画设计与影视制作,计算机动画设计及制作中的特效技术