【OpenCV使用小结】鼠标回调函数setMouseCallback

话不多说,直接甩代码。

以下代码实现的功能如下:

1、通过鼠标左键的按下和松开,在黑色的窗口中绘制矩形。

2、按esc退出,并将绘制的图片导出保存。

3、主要使用 鼠标回调函数setMouseCallback(.....)。

#include <opencv2/opencv.hpp>

using namespace cv;

//-----------------------【全局变量声明部分】-------------------------
Rect m_rect;
bool m_drawBox = false;
RNG m_rng(12345);

String windowName = "鼠标拖动绘制矩形";

//-----------------------【全局函数声明部分】-------------------------
void on_mouseHandle(int event,int x,int y,int flag, void *param);
void DrawRect(Mat &img,Rect box);

//-----------------------【main函数部分】-----------------------------
int main(int argc,char* argv[]){
	m_rect = Rect(-1,-1,0,0);
	Mat srcImg(600,800,CV_8UC3),tempImg;
	srcImg.copyTo(tempImg);
	srcImg = Scalar::all(0);

	namedWindow(windowName);
	/*--------------------【setMouseCallback说明】--------------------
	  函数void setMouseCallback(conststring& winname,//窗口的名字
								MouseCallback onMouse,//指定窗口里每次鼠标时间发生的时候,被调用的函数指针
								void* userdata=0);//用户定义的传递到回调函数的参数,有默认值0
	  onMouse函数的原型应该为voidFoo(int event, int x, int y, int flags, void* param);
	  其中event是 CV_EVENT_*变量之一, 
	  x和y是鼠标指针在图像坐标系的坐标(不是窗口坐标系), 
	  flags是CV_EVENT_FLAG的组合, 
	  param是用户定义的传递到cvSetMouseCallback函数调用的参数。
	-------------------------------------------------------------------*/
	setMouseCallback(windowName,on_mouseHandle,(void *)&srcImg);

	while(1){
		srcImg.copyTo(tempImg);
		if(m_drawBox) DrawRect(tempImg,m_rect);
		imshow(windowName,srcImg);
		if(waitKey(10) == 27 ) {
			imwrite("1.png",srcImg);
			break;
		}
	}
	return  0;
}

//-----------------------【on_mouseHandle函数】---------------------------
void on_mouseHandle(int event,int x,int y,int flag, void *param){
	//先将param强制转化成一个mat类型的指针,然后引用指针指向的值(即image是*param的一个别名)
	Mat &image = *(Mat*) param;
	//Mat *image = (Mat*) param;//与上述语句功能等价

	switch (event)
	{
	case EVENT_MOUSEMOVE:
		{
			if(m_drawBox){
				m_rect.width = x - m_rect.x;
				m_rect.height = x - m_rect.y;
			}
		}
		break;
	case EVENT_LBUTTONDOWN:
		{
			m_drawBox = true;
			m_rect = Rect(x,y,0,0);
		}
		break;
	case EVENT_LBUTTONUP:
		{
			m_drawBox = false;
			if(m_rect.width < 0){
				m_rect.x += m_rect.width;
				m_rect.width *= -1;
			}
			if(m_rect.height < 0){
				m_rect.y += m_rect.height;
				m_rect.height *= -1;
			}

			DrawRect(image,m_rect);
			m_rect = Rect(-1,-1,0,0);
		}
	default:
		break;
	}
}


//-----------------------【DrawRect函数】---------------------------
void DrawRect(Mat &img,Rect box){
	rectangle(img,box.tl(),box.br(),
		Scalar(m_rng.uniform(0,255),m_rng.uniform(0,255),m_rng.uniform(0,255)));
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值