Opencv HighGUI函数_用鼠标在窗口中画方形

来源:互联网 发布:nginx lua redis性能 编辑:程序博客网 时间:2024/05/18 14:27

要实现用鼠标在窗口中画方形,首先要实现鼠标事件。鼠标事件响应采用回调函数的方式来实现的。

所以为了响应鼠标事件首先需要创建一个回调函数,然后再注册这个函数。


回调函数格式

void CvMouseCallback(

    int event,

    int x,

    int y,

    int flags,

    void* param

);

第一个参数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

第二个及第三个参数是事件发生时鼠标位置的x,y坐标值

第四个参数是事件发生时的不同状态:

标志名称                                                  数值

CV_EVENT_FLAG_LBUUTON                 1

CV_EVENT_FLAG_RBUUTON                 2

CV_EVENT_FLAG_MBUUTON                 4

CV_EVENT_FLAG_CTRLKEY                  8

CV_EVENT_FLAG_SHIFTKEY                 16

CV_EVENT_FLAG_ALTKEY                     32

最后一个参数是void指针,可以用来以任何结构方式传递额外的参数信息,通常情况下,当回调函数为一个类的静态成员时,可能需要传递这个类的指针以确定对哪个类实例产生影响。


注册回调函数

void cvSetMouseCallback(

    const char* window_name,

    CvMouseCallbakc on_mouse,

    void* param=NULL

);

第一个参数指定回调函数需要注册到的窗口,也就是事件产生的窗口

第二个参数为回调函数

第三个参数用来传递额外的信息给回调函数的void* param参数


实现代码:

#include "cv.h"#include "Highgui.h"void my_mouse_callback(int event,int x,int y,int flags,void* param);CvRect box;bool drawing_box = false;void draw_box(IplImage* img,CvRect rect){cvRectangle(img,CvPoint(box.x,box.y),CvPoint(box.x+box.width,box.y+box.height),CvScalar(0xff,0x00,0x00));}int main(int argc,char ** argv){box = cvRect(-1,-1,0,0);IplImage* image = cvCreateImage(CvSize(200,200),IPL_DEPTH_8U,3);cvZero(image);IplImage* temp = cvCloneImage(image);cvNamedWindow("Box Example");cvSetMouseCallback("Box Example",my_mouse_callback,(void*)image);while(1){cvCopy(image,temp);if (drawing_box){draw_box(temp,box);}cvShowImage("Box Example",temp);if(cvWaitKey(15)==27)break;}cvReleaseImage(&image);cvReleaseImage(&temp);cvDestroyWindow("Box Example");return 0;}void my_mouse_callback(int event,int x,int y,int flags,void* param){IplImage* image = (IplImage*)param;switch(event){case CV_EVENT_MOUSEMOVE:{if (drawing_box){box.width = x-box.x;box.height = y-box.y;}}break;case CV_EVENT_LBUTTONDOWN:{drawing_box = true;box = cvRect(x,y,0,0);}break;case CV_EVENT_LBUTTONUP:{drawing_box = false;if (box.width<0){box.x+=box.width;box.width*=-1;}if (box.height<0){box.y+=box.height;box.height*=-1;}draw_box(image,box);}break;}}


原创粉丝点击