(1) 基本的鼠标 按钮操作
转载学习
https://blog.csdn.net/NCHFGFB/article/details/51516030
https://blog.csdn.net/shyn02588/article/details/44151481
①鼠标事件
回调函数
CV_EXPORTS void setMouseCallback(const string& winname, MouseCallback onMouse, void* userdata = 0);
const string& winname,windows视窗名称,对名为winname的视窗进行鼠标监控。
MouseCallback onMouse,鼠标响应处理函数,监听鼠标的点击,移动,松开,判断鼠标的操作类型,并进行响应的函数处理。
void* userdata = 0 鼠标响应处理函数的ID,与鼠标相应处理函数相匹配就行,暂时只用到默认为0的情况。
鼠标响应函数
void on_mouse(int event,int x,int y,int flags,void *ustc)
x,y代表相应位置
鼠标位于窗口的(x,y)坐标位置,窗口左上角默认为原点,向右为x轴,向下为y轴。
event事件:
enum
{
CV_EVENT_MOUSEMOVE =0, //鼠标移动
CV_EVENT_LBUTTONDOWN =1, //按下左键
CV_EVENT_RBUTTONDOWN =2, //按下右键
CV_EVENT_MBUTTONDOWN =3, //按下中键
CV_EVENT_LBUTTONUP =4, //放开左键
CV_EVENT_RBUTTONUP =5, //放开右键
CV_EVENT_MBUTTONUP =6, //放开中键
CV_EVENT_LBUTTONDBLCLK =7, //左键双击
CV_EVENT_RBUTTONDBLCLK =8, //右键双击
CV_EVENT_MBUTTONDBLCLK =9, //中键双击
CV_EVENT_MOUSEWHEEL =10, //滚轮滚动
CV_EVENT_MOUSEHWHEEL =11 //横向滚轮滚动
};
flags,代表鼠标的拖拽事件
enum
{
CV_EVENT_FLAG_LBUTTON =1, //左键拖拽
CV_EVENT_FLAG_RBUTTON =2, //右键拖拽
CV_EVENT_FLAG_MBUTTON =4, //中键拖拽
CV_EVENT_FLAG_CTRLKEY =8, //按住CTRL拖拽
CV_EVENT_FLAG_SHIFTKEY =16, //按住Shift拖拽
CV_EVENT_FLAG_ALTKEY =32 //按住ALT拖拽
};
实例 简单画图和ROI提取
画线
#include <iostream>
#include <opencv2/core/core.hpp>
#include <opencv2/highgui/highgui.hpp>
#include <stdio.h>
using namespace cv;
using namespace std;
Mat src(500,500,CV_8UC3,Scalar(255,255,255));
bool down = false;
Point prept = Point(0, 0);
Point curpt = prept;
void on_mouse(int event, int x, int y, int flags, void* ustc)
{
if (event == CV_EVENT_LBUTTONDOWN) //右键按下
{
prept = Point(x, y);
down = true;
}
else if (event == CV_EVENT_LBUTTONUP) //右键放开
down = false;
if (down ==true&&event == CV_EVENT_MOUSEMOVE) //右键按下且鼠标移动
{
curpt = cvPoint(x, y);
line(src, prept, curpt, Scalar(255, 0, 0), 5);
waitKey(5); //可以解决画图时卡顿的问题
imshow("src", src);
prept = curpt;
}