程序定义了一个drawbox结构,结构中包含矩形的两个对角点,两个图像指针(程序可以指定在哪个图像上画矩形)和一个控制是否画图的bool类型变量。在回调函数中,程序监听了三种类型的鼠标事件:左键按下、鼠标移动和左键抬起。这三种类型的鼠标事件定义了一个完整的鼠标画图过程。左键按下时开始画图,拖动显示所画的图形,左键抬起表示画图结束。在结束之前,为了实时显示所画的图形,将所画的图放在box结构中的temp变量中,待画图结束时在box结构的image中存放这一次画图的最终结果。
#include<cv.h>
#include<highgui.h>
#include<iostream>
using namespace std;
// callback function
void cvMouseCallback(int mouseEvent,int x,int y,int flags,void* param);
struct drawbox
{
CvPoint point1;
CvPoint point2;
IplImage* image;
IplImage* temp;
bool isDraw;
}; Unity3D教程手册
int main(int argc,char* argv[])
{
// declare and initialize a struct drawbox variable
drawbox box;
box.point1 = cvPoint(0,0);
box.point2 = cvPoint(0,0);
box.image = cvCreateImage(cvSize(640,480),IPL_DEPTH_8U,3);
cvZero(box.image);
box.temp = cvCloneImage(box.image);
box.isDraw = false;
// register a mouse callback function
cvNamedWindow("exam",CV_WINDOW_AUTOSIZE);
cvSetMouseCallback("exam",cvMouseCallback,&box);
while(1)
{
cvCopy(box.image,box.temp);
if(box.isDraw)
{
cvRectangle(box.temp,box.point1,box.point2,CV_RGB(255,255,255));
}
cvShowImage("exam",box.temp);
if(cvWaitKey(20) == 27) break;
}
cvReleaseImage(&box.image);
cvReleaseImage(&box.temp);
cvDestroyWindow("exam");
return 0;
}
void cvMouseCallback(int mouseEvent,int x,int y,int flags,void* param)
{
drawbox* box = (drawbox*)param;
switch(mouseEvent)
{
case CV_EVENT_LBUTTONDOWN:
box->point1 = cvPoint(x,y);
box->point2 = cvPoint(x,y);
box->isDraw = true;
break;
case CV_EVENT_MOUSEMOVE:
box->point2 = cvPoint(x,y);
break;
case CV_EVENT_LBUTTONUP:
box->point2 = cvPoint(x,y);
cvRectangle(box->image,box->point1,box->point2,CV_RGB(0,255,0));
box->isDraw = false;
break;
}
return;
}