• 首页 首页 icon
  • 工具库 工具库 icon
    • IP查询 IP查询 icon
  • 内容库 内容库 icon
    • 快讯库 快讯库 icon
    • 精品库 精品库 icon
    • 问答库 问答库 icon
  • 更多 更多 icon
    • 服务条款 服务条款 icon

OpenCV:鼠标函数setMouseCallback

武飞扬头像
木槿家的巷港
帮助1

鼠标事件响应

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 <opencv2/highgui.hpp>
#include <opencv2/imgproc.hpp>
#include <opencv2/core.hpp>
#include <iostream>
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

这篇好文章是转载于:学新通技术网

  • 版权申明: 本站部分内容来自互联网,仅供学习及演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,请提供相关证据及您的身份证明,我们将在收到邮件后48小时内删除。
  • 本站站名: 学新通技术网
  • 本文地址: /boutique/detail/tanhhackfb
系列文章
更多 icon
同类精品
更多 icon
继续加载