九 openCV教程 鼠标事件

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

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

函数原型:

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

参数:

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

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

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

二、函数指针原型:

void  onEvent(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函数调用的参数。

三、鼠标事件示例

static void onmouseEvent(int event, int x, int y, int flag, void* userdata) {
	static  Point sp(-1, -1);
	static  Point ep(-1, -1);
 	Mat bg = *((Mat*)userdata);
	
	if (event == EVENT_LBUTTONDOWN) {
		sp.x = x;
		sp.y = y;

	}
	if (event == EVENT_LBUTTONUP) {
		ep.x = x;
		ep.y = y;
		Rect rc(Point(sp.x, sp.y), Point(ep.x, ep.y));

		rectangle(bg, rc, Scalar(0, 0, 255), 1, 8, 0);
		cout << "startp" << sp << endl;
		cout << "endp" << ep << endl;
		imshow("鼠标绘图", bg);
		sp.x = 0;
		sp.y = 0;
	}
	if (event == EVENT_MOUSEMOVE && flag==EVENT_FLAG_LBUTTON) {
		ep.x = x;
		ep.y = y;
		if (sp.x > 0 && sp.y > 0) {
			Rect rc(Point(sp.x, sp.y), Point(ep.x, ep.y));
			tempbg.copyTo(bg);
			rectangle(bg, rc, Scalar(0, 0, 255), 1, 8, 0);
			imshow("鼠标绘图", bg);
		}
	}

}
void myCV::mouseEvent()
{
	namedWindow("鼠标绘图", WINDOW_AUTOSIZE);
	static Mat bg = imread("05.jpg");
	 tempbg = bg.clone();
	setMouseCallback("鼠标绘图", onmouseEvent, &bg);
	imshow("鼠标绘图", bg);
}

  • 8
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值