opencv 之 鼠标事件,回调函数

标签: 鼠标事件 SetMouseCallback 鼠标回调函数 opencv 参数详解
16人阅读 评论(0) 收藏 举报
分类:

主要介绍

    鼠标事件的函数原型及参数

    回调函数的原型及参数

    鼠标事件画矩形的例子

指定鼠标操作消息回调函数的函数为SetMouseCallback函数。

函数原型:

      void   SetMouseCallback(const string & winname,MouseCallback onMouse,void* userdata=0)

参数:

第一个参数为窗口的名字,

第二个参数用来指定窗口每次鼠标时候发生的时候,被调用函数指针,

第三个参数则为用户定义的传递到回调函数的参数。

其中函数指针原型:

void Foo(int event ,int x ,int y ,int flags  ,void * param)。

参数:

event 是鼠标响应类型,CV_EVENT_*变量之一:

EVENT_MOUSEMOVE滑动

EVENT_LBUTTONDOWN 左击

EVENT_RBUTTONDOWN 右击

 

EVENT_MBUTTONDOWN中键点击

EVENT_LBUTTONUP 左键放开

EVENT_RBUTTONUP 右键放开

 

EVENT_LBUTTONDBLCLK左键双击

EVENT_RBUTTONDBLCLK 右键双击

EVENT_MBUTTONDBLCLK 中键双击

x和y是鼠标指针在图像坐标系的坐标(不是窗口坐标系)。

flags是CV_EVENT_FLAG的组合,flag的状态有:

EVENT_FLAG_LBUTTON 左键拖拽

EVENT_FLAG_RBUTTON 右键拖拽

EVENT_FLAG_MBUTTON 中键拖拽

EVENT_FLAG_CTRLKEY 按住Ctrl不放

EVENT_FLAG_SHIFTKEY 按住Shift不放

EVENT_FLAG_ALTKEY 按住Alt不放

param是用户定义的传递到setMouseCallback函数调用的参数。

通过鼠标回调函数绘制矩形代码如下:

void MouseEvent();    //主函数
void on_MouseHandle(int event,int x, int y, int flag, void* param);    //回调函数

void DrawRectangle(Mat& img,Rect box);    //画矩形

/*****************鼠标操作*****************/
Rect g_rect;
bool g_DrawFlag = false;
RNG g_rng(12345);
void MouseEvent()
{
	//准备参数
	g_rect = Rect(-1, -1, 0, 0);
	Mat srcImage(600, 600, CV_8UC3), tempImage;
	srcImage.copyTo(tempImage);
	g_rect = Rect(-1, -1, 0, 0);
	srcImage = Scalar::all(0);

	//设置鼠标操作回调函数
	namedWindow("Win");
	setMouseCallback("Win", on_MouseHandle, (void*)&srcImage);
	
	//绘画
	while (1)
	{
		srcImage.copyTo(tempImage);
		if (g_DrawFlag) {
			DrawRectangle(tempImage, g_rect);
		}
		imshow("Win", tempImage);
		if (waitKey(10) == 27) break;//ESC 退出
	}
}
//鼠标回调事件
void on_MouseHandle(int event, int x, int y, int flag, void* param)
{
	Mat& image = *(Mat*)param;
	switch (event)
	{
	case EVENT_MOUSEMOVE://移动
		if (g_DrawFlag) {
			//计算,g_rect宽高=鼠标当前位置坐标-g_rect左上角的坐标
			g_rect.width = x - g_rect.x;
			g_rect.height = y - g_rect.y;
		}
		break;
	case EVENT_LBUTTONDOWN://左键按下
		g_DrawFlag = true;
		//设置g_rect的初始值在同一个点
		g_rect = Rect(x, y, 0, 0);
		break;
	case EVENT_LBUTTONUP://左键抬起
		g_DrawFlag = false;
		//当g_rect宽高小于0
		//起始点xy坐标置为较小靠左上角的点
		//宽高取绝对值
		if (g_rect.width < 0) {
			g_rect.x += g_rect.width;
			g_rect.width *= -1;
		}
		if (g_rect.height < 0) {
			g_rect.y += g_rect.height;
			g_rect.height *= -1;
		}
		//画矩形
		DrawRectangle(image, g_rect);
		break;
	}
}
//矩形绘制函数
void DrawRectangle(Mat& img, Rect box)
{
	//rectangle画矩形
	//tl左上角的点,br右下角的点
	//Scalar设置颜色,设置为3通道
	//g_rng.uniform(0, 255)随机颜色
	rectangle(img, box.tl(), box.br(), Scalar(g_rng.uniform(0, 255),
		g_rng.uniform(0, 255), g_rng.uniform(0, 255)));
}

效果:


 

查看评论

Opencv函数setMouseCallback鼠标事件响应

Opencv中setMouseCallback()创建了一个鼠标回调函数,每次在图像上单击鼠标左键再抬起的过程,都会分3次调用鼠标响应函数,并且响应顺序是: 1.左键单击按下; 2.左键单击抬起; 3...
  • dcrmg
  • dcrmg
  • 2016-07-30 01:23:25
  • 7798

openCV鼠标事件学习

opencv中鼠标事件的学习
  • gu_gu_
  • gu_gu_
  • 2015-11-09 20:39:27
  • 242

opencv2+ 鼠标事件详解及示例代码

转自:http://www.cnblogs.com/lidabo/p/3437587.html   前言        好长时间没写博文了,今天偷偷懒写篇关于opencv2中鼠标响应操作的文章。 ...
  • m0_37901643
  • m0_37901643
  • 2017-06-22 10:37:01
  • 810

opencv MFC中的鼠标响应函数

方法一: bool check_line_state=false; IplImage* imgshow; void on_mouse4(int event, int x,int y,int f...
  • abcjennifer
  • abcjennifer
  • 2012-04-24 10:30:02
  • 7276

python-opencv 关于鼠标的回调函数

先贴源码 import numpy as np import cv2 if __name__ == '__main__':     import sys     try: fn = sys.argv[...
  • nathan1025
  • nathan1025
  • 2016-10-27 16:47:14
  • 834

【OpenCV】 处理鼠标事件

int main(){ setMouseCallback("ImageName",mouseHandler,0); } void mouseHandler(int event, int x, ...
  • otones
  • otones
  • 2015-03-13 16:25:39
  • 1010

opencv 3.0 鼠标操作 setMouseCallback

网上有贴出opencv中 setMouseCallback 的参数表 但是对于怎么用的,却没有太多实例 不多说,上代码:   值得注意的是:(调试N久才发现的大教训!) 以前用imshow,都不一定先...
  • billbliss
  • billbliss
  • 2015-02-02 12:59:42
  • 1180

OpenCV对鼠标事件的处理

实验环境:Windows10 x64 vs2013 + openCV2.4.11实验目的:通过实验体会openCV实现的对鼠标事件处理的设置回调函数setMouseCallback的使用,体会其中的...
  • u013777351
  • u013777351
  • 2016-02-29 09:36:29
  • 2751

Open CV 学习笔记:鼠标操作(回调函数)

#include #include #include #define WINDOW_NAME "chengxuchuangkou" using namespace cv; void on_...
  • ymmqwe
  • ymmqwe
  • 2015-03-25 16:53:16
  • 2467

OpenCV学习笔记之鼠标响应回调函数setMouseCallback

openCv中的鼠标回调函数是为了处理鼠标操作消息的响应事件,函数原型为:                      C++:   void   SetMouseCallback(const str...
  • my_lord_
  • my_lord_
  • 2016-12-29 15:51:55
  • 1847
    个人资料
    持之以恒
    等级:
    访问量: 5429
    积分: 743
    排名: 6万+
    最新评论