鼠标事件
这一节接触了以下内容:
CvMouseCallback(int event, int x, int y, int flags, void* param)和cvSetMouseCallback(const char* window_name, CvMouseCallback on_mouse, void* param=NULL):第一个为鼠标事件响应的回调函数,第二个为回调函数的注册函数;
为了可以相应鼠标点击事件,首先必须创建一个回调函数,使鼠标点击事件发生时OpenCV可以调用这个函数,创建这个函数以后,需要在OpenCV中注册这个函数,以便特定窗口被触发鼠标事件以后,OpenCV可以正确调用这个函数。
程序编写:
编程环境:windows xp系统; opencv 1.0; VC++6.0;
程序说明:
这个程序可以通过鼠标来画方形。
加入头文件:
#include <cv.h>
#include <highgui.h>
主要程序代码:
// TODO: Add extra initialization here box = cvRect(-1, -1, 0, 0); IplImage* image = cvCreateImage(cvSize(500, 500), IPL_DEPTH_8U, 3); //创建图像 cvZero(image); //初始化图像 IplImage* temp = cvCloneImage(image); //克隆图像副本 cvNamedWindow("lovely"); cvSetMouseCallback("lovely", my_mouse_callback, (void*) image); //注册回调函数 while (1) { cvCopyImage(image, temp); if (drawing_box) { draw_box(temp, box); } cvShowImage("lovely", temp); if (cvWaitKey(15) == 27) { break; } }
//画方形 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)); } //鼠标事件的响应函数 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; } }
运行成功界面: