要实现用鼠标在窗口中画方形,首先要实现鼠标事件。鼠标事件响应采用回调函数的方式来实现的。
所以为了响应鼠标事件首先需要创建一个回调函数,然后再注册这个函数。
回调函数格式
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;
}
}