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 <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
系列文章
更多
同类精品
更多
-
photoshop保存的图片太大微信发不了怎么办
PHP中文网 06-15 -
《学习通》视频自动暂停处理方法
HelloWorld317 07-05 -
word里面弄一个表格后上面的标题会跑到下面怎么办
PHP中文网 06-20 -
Android 11 保存文件到外部存储,并分享文件
Luke 10-12 -
photoshop扩展功能面板显示灰色怎么办
PHP中文网 06-14 -
微信公众号没有声音提示怎么办
PHP中文网 03-31 -
excel下划线不显示怎么办
PHP中文网 06-23 -
excel打印预览压线压字怎么办
PHP中文网 06-22 -
TikTok加速器哪个好免费的TK加速器推荐
TK小达人 10-01 -
怎样阻止微信小程序自动打开
PHP中文网 06-13