这里主要是训练怎么去响应鼠标响应事件,那怎么去定义鼠标响应函数呢?
void CvMouseCallback(
int event;//鼠标响应事件的类型如鼠标右键弹起,右键按下,CV_EVENT_LBUTTONDOWN,CV_EVENT_LBUTTONDOWN)
int x,//鼠标响应是所在的位置,这里x,y是指像素坐标,所以与窗口的大小无关,它只是用像素来定位
int y,
int falgs,//指定了每一个事件在发生时的不同状态
void *param//这个参数由注册鼠标响应时间的时候传入
)//cvMouseCallback名字是可以改变的,不准确,应该说必须改---
另外一个重要函数就是
CvSetMouseCallback(
const char*window_name,//窗口的名字,也就是你要捕获哪个窗口的鼠标响应事件
CvMouseCallback on_mouse,//你的鼠标响应事件函数的名字
void * param=NULL//这个参数就是就是要传进鼠标响应事件的参数,在本例中,我使用的是将图像的地址传进去
}
下面附上
#include "cv.h"
#include "highgui.h"
#include "math.h"
bool flag=false;
CvRect box;
void Mouse_Call_Back(int event,int x,int y,int flags,void *param)
{
IplImage *image = (IplImage*)param;
// cvNamedWindow("test",1);
//cvPoint start;
switch(event)
{
case CV_EVENT_LBUTTONDOWN:
box.x=x;
box.y=y;
break;
case CV_EVENT_LBUTTONUP:
box.width=abs(x-box.x);
box.height=abs(y-box.y);
cvRectangle(image,cvPoint(box.x,box.y),cvPoint(x,y),cvScalar(0,255,0));
// cvShowImage("test",image);
break;
}
}
int main()
{
cvNamedWindow("Mouse",1);
IplImage * image =cvCreateImage(cvSize(500,500),IPL_DEPTH_8U,3);
cvZero(image);
cvSetMouseCallback("Mouse",Mouse_Call_Back,(void*)image);
while(1)
{
int ch=cvWaitKey(33);
if(ch==27)
break;
cvShowImage("Mouse",image);
//注意显示图像,你每一次都对图像进行修改,但是不显示还是一样的,你只有一只输出图像,我刚开始就是把这个放到外面了,
}
cvWaitKey(0);
cvDestroyWindow("Mouse");
return 0;
}
结果如下: