OPencv透视变换 鼠标回调函数使用
Opencv 鼠标回调事件编写
所有的鼠标事件回调函数都有一个统一的格式,他们所不同的地方仅仅是被调用后的功能。
1、setMouseCallback()函数
void setMouseCallback(const string& winname, //图像视窗名称
MouseCallback onMouse, //鼠标响应函数,监视到鼠标操作后调用并处理相应动作
void* userdata = 0 //传给回调函数的参数 ,例如当鼠标在 winname的窗口进行操作时,将指针的地址传给onMouse函数(回调函数=响应函数)
2、void Mousehundle(int event,int x,int y,int flag,void * per)
响应函数 格式固定int event,int x,int y,int flag,void * per
event:为 CV_EVENT_*所定义,代表鼠标点击事件,每当鼠标有点击事件发生,就把相应数字传给on_Mouse函数,以进行下一步处理。
x,y:鼠标在当前图片选中的点坐标
flag:flags为CV_EVENT_FLAG所定义,代表鼠标拖拽事件
per:数据,表示在哪一张图片上操作
3、C++中 event的对应事件:
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//中键双击
flags的对应事件:
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不放
4、案例说明:实现 在图片上,点击鼠标左键可以标注红点
①结构体:
struct imagedata
{
Mat img;//图片
vector<Point2f> points;//选取到的坐标 用vector存放
};
②鼠标回调事件:setMouseCallback(“窗口名称”,回调函数,结构体数据)
//鼠标选点
struct imagedata data;
data.img=image;
//鼠标回调函数
setMouseCallback("image",Mousehundle,&data);
③响应函数实现:
void Mousehundle(int event,int x,int y,int flag,void * per)
{
struct imagedata * d=(struct imagedata *)per;
if(event==EVENT_LBUTTONDOWN)
{
//画原点,红色 半径=3
circle(d->img,Point(x,y),3,Scalar(0,0,255),3,CV_AA);
//imshow("image",d->img);
imshow("dst",d->img);
if(d->points.size()<4)
{
d->points.push_back(Point2f(x,y));
}
}
}

浙公网安备 33010602011771号