openCV鼠标事件实例

来源:互联网 发布:面包车拉货软件 编辑:程序博客网 时间:2024/05/17 04:38

1.原理

OpenCV的鼠标事件主要涉及两个函数:
  • 回调函数cvSetMouseCallback
void cvSetMouseCallback( const char* window_name, CvMouseCallback on_mouse, void* param CV_DEFAULT(NULL));
window_name:鼠标执行的窗口名;
on_mouse:每次指定窗口鼠标事件发生时被调用的函数指针;
param :传递到回调函数的参数
  • on_mouse的原型
void Foo(int event, int x, int y, int flags, void* param);
param:传递到cvSetMouseCallback函数调用的参数
x、y:鼠标指针在图像坐标系的坐标
event: CV_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//中键双击};
flags:是CV_EVENT_FLAG的组合
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};

2.实例

#include <cv.h>#include <highgui.h>//define our callback which we will install for mouse eventsvoid my_mouse_callback(int event, int x, int y, int flags, void* param);CvRect box;bool drawing_box = false;// a little subroutine to draw a box onto an imagevoid 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));}void main(int argc, char** argv){box = cvRect(-1,-1,0,0);IplImage* image = cvCreateImage(              cvSize(200,200),  IPL_DEPTH_8U,  3);cvZero( image );  //image space initializedIplImage* temp = cvCloneImage( image );cvNamedWindow( "BoxExample" );//install the callbackcvSetMouseCallback("BoxExample",my_mouse_callback,(void*) image);while (1){cvCopy(image, temp);if(drawing_box)draw_box(temp,box);cvShowImage("BoxExample",temp);if(cvWaitKey( 15 ) == 27)break;}cvReleaseImage( &image );cvReleaseImage( &temp );cvDestroyWindow( "BoxExample");}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;}}
输出结果:

3.参考资料

Bradski G, Kaehler A. Learning OpenCV: Computer Vision in C++ with the OpenCV Library[M]. O'Reilly Media, Inc. 2013.
原创粉丝点击