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:鼠标在当前图片选中的点坐标

flagflags为CV_EVENT_FLAG所定义,代表鼠标拖拽事件

per:数据,表示在哪一张图片上操作

 

3C++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));

        }

    }

 

}

 

posted @ 2022-02-18 14:33  代码改变世界11  阅读(227)  评论(0)    收藏  举报