OpenCV之鼠标函数setMouseCallback

鼠标事件响应

void setMouseCallback(const String& winname , MouseCallback onMouse,void* userdata = 0);
/*
		winname: 监听窗口名字
		onMouse:鼠标事件回调函数
		userdata:递给回调函数可选参数
*/

鼠标事件回调函数

typedef void (*MouseCallback)(int event,int x,int y,int flags,void* userdata);
//MouseCallback onMouse

void onMouse(int event,int x,int y,int flag,void* param)
/*
	event  事件类型
	x:     鼠标所造图像坐标
	y:     
	flags:代表拖拽事件
	param: 代表定义的onMouse的事件的ID
*/


鼠标事件类型

enum MouseEventType
{
	  EVENT_MOUSEMOVE       = 0, //!<  表示鼠标指针已移动到窗口上方。
       EVENT_LBUTTONDOWN    = 1, //!< 表示鼠标左键被按下。
       EVENT_RBUTTONDOWN    = 2, //!< 表示鼠标右键被按下。
       EVENT_MBUTTONDOWN    = 3, //!< 表示鼠标中键被按下。
       EVENT_LBUTTONUP      = 4, //!< 表示释放鼠标左键。
       EVENT_RBUTTONUP      = 5, //!< 表示释放鼠标右键。
       EVENT_MBUTTONUP      = 6, //!< 表示鼠标中键释放。
       EVENT_LBUTTONDBLCLK  = 7, //!< 表示双击鼠标左键。
       EVENT_RBUTTONDBLCLK  = 8, //!< 表示双击鼠标右键。
       EVENT_MBUTTONDBLCLK  = 9, //!< 表示双击鼠标中键。
       EVENT_MOUSEWHEEL     = 10,//!< 正值和负值分别表示向前和向后滚动。
       EVENT_MOUSEHWHEEL    = 11 //!< 正值和负值分别表示向右和向左滚动。
}

鼠标拖拽类型

enum MouseEventFlags {
       EVENT_FLAG_LBUTTON   = 1, //!< 表示鼠标左键未按下。
       EVENT_FLAG_RBUTTON   = 2, //!<表示鼠标右键未按下。
       EVENT_FLAG_MBUTTON   = 4, //!< 表示鼠标中键未按下。
       EVENT_FLAG_CTRLKEY   = 8, //!< 表示按下“CTRL”
       EVENT_FLAG_SHIFTKEY  = 16,//!< 表示按下SHIFT键。
       EVENT_FLAG_ALTKEY    = 32 //!< 表示按下ALT键。
     };

小案列

已经看了这么的函数与枚举,该写写代码了

#include 
#include 
#include 
#include 
using namespace cv;
using namespace std;

class DrawShape
{
public:
	DrawShape()
		:mat(imread("1.jpg")){}
	void Show(string wName = "drawShape")
	{
		imshow(wName, mat);
	}

	void DrawCircle(int x = 300, int y = 300, int r = 10) //画圆函数,如果记不住自己去看看
	{
		circle(mat, Point(x, y), r, Scalar(0, 244, 0));
	}

	void DrawRecagnle(int x = 200, int y = 200, int w = 40, int h = 40) //画矩形函数
	{
		rectangle(mat, Rect(x, y, w, h), Scalar(25, 0, 0, 0));
	}
	static void OnMouse(int event, int x, int y, int flag, void* param); //鼠标
protected:

	Mat mat;

};

void DrawShape::OnMouse(int event, int x, int y, int flag, void* param)
{
	DrawShape* pShape = (DrawShape*)param;
	switch (event)
	{
	case EVENT_LBUTTONDOWN:
		cout << "左键按下" << endl;
		pShape->DrawCircle(x,y,10);
			break;
	case EVENT_RBUTTONDOWN:
		cout << "右键按下" << endl;
		pShape->DrawRecagnle(x, y, 10, 10);
			break;
	}
}

int main()
{

	DrawShape* pshape = new DrawShape;
	//t.DrawCircle();
	//t.Show();
	namedWindow("drawShape");
	setMouseCallback("drawShape", &DrawShape::OnMouse, pshape);

	//主循环
	while (1)
	{
		pshape->Show();
		if (waitKey(10) == 27)
		{
			break;
		}
	}

	delete[] pshape;
	pshape = nullptr;
 	return 0;
}

注:2023.2.28

你可能感兴趣的:(opencv,opencv)