现在已经可以显示一张图像给用户,但是更加希望给用户互动性强一点内容——用鼠标绘图。其实我已经知道使用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做鼠标绘图相关推荐

  1. python鼠标绘图_python opencv入门 鼠标绘图(4)

    目标: 学习如何操作鼠标事件 学习cv2.setMouseCallback()函数 简单样例: 首先创建一个鼠标的回调函数,当鼠标事件触发时,该函数执行. 鼠标事件有很多种,比如左键右键,双击等等,该 ...

  2. python opencv入门 鼠标绘图(4)

    内容来自OpenCV-Python Tutorials 自己翻译整理 目标: 学习如何操作鼠标事件 学习cv2.setMouseCallback()函数 简单样例: 首先创建一个鼠标的回调函数,当鼠标 ...

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

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

  4. opencv 鼠标绘图

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

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

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

  6. Pytorch快速搭建Alexnet实现手写英文字母识别+PyQt实现鼠标绘图

    Pytorch快速搭建Alexnet实现手写英文字母识别+PyQt实现鼠标绘图 前言 一.案例要求 二.训练数据准备 1.下载手写英文字母数据集 2.构建自己的数据集 三.AlexNet实现 1.Al ...

  7. OpenCV I_07鼠标画笔 setMouseCallback()

    目标 • 学习使用 OpenCV 处理鼠标事件 • 你将要学习的函数是:cv2.setMouseCallback() 鼠标事件 :cv2.setMouseCallback() cv2_EVENT_MO ...

  8. 整活--我是如何用OpenCV做了数字华容道游戏(附源码)

    学更好的别人, 做更好的自己. --<微卡智享> 本文长度为3829字,预计阅读9分钟 前言 数字华容道,记得以前<最强大脑>上一个初赛题目,正好最近家里买了个数字华容道的玩具 ...

  9. Opencv做mark点寻边定位

    Opencv做mark点寻边定位 通过mark点进行定位是很常见的项目,mark点就是在图上或者工件上设置一个标志性的mark点,在这里以圆点为例,如图: 这个原图是一个很大的板子,然后四个角分别有一 ...

最新文章

  1. 活动报名 | 因果科学与Casual AI读书会
  2. FEKO V7.0安装教程
  3. python学了基础之后方向_学习了解python基础后,该进去哪一个方向呢?
  4. Vue.js 作者尤雨溪:TypeScript 与 JavaScript 并行才切合实际!
  5. 18大产业的产业链全景图!(高清大图)
  6. 我的技术博客开通了!
  7. CentOS中MySQL5.6 数据库主从(Master/Slave)同步安装与配置详解
  8. 程序员常用的画图软件推荐
  9. c语言中(char)的用法,c语言中char的用法是什么意思.docx
  10. 初生牛犊不怕虎 golang入坑系列
  11. Visio绘制论文文献技术路线图流程图
  12. req和res的作用
  13. 中海国亚Java笔试题
  14. 使用java数据结构编写代码
  15. openpyxl中的load_workbook()函数
  16. 代码简短且隐蔽的后门木马
  17. You Only Look One-level Feature
  18. nginx pc 端和 手机移动端分离
  19. Get the 1,000- Foot View
  20. Pentadactyl使用技巧

热门文章

  1. Python 使用 opencv 库将BMP格式图片转RAW
  2. 基于 Java 的短视频实战项目
  3. MFC学习总结 (67个技巧)
  4. android刷机知识大全,安卓主流机型刷机基础科普 教你刷机不求人
  5. 基于深度学习的两种信源信道联合编码
  6. 推迟上市的网易云,逃不开在线音乐市场的“白刃战”
  7. 安卓开发SlidingDrawer实现抽屉效果
  8. w7计算机管理器怎么打开,windows7系统任务管理器怎么打开?快捷键是什么?
  9. 机械学习07: 常用统计分布:正态分布、T分布、卡方分布、F分布
  10. 计算机动画设计与影视制作,计算机动画设计及制作中的特效技术