创建一幅黑色的图像,显示后,用鼠标在显示窗口中,拖动以画出长方形:
#include "stdafx.h"
#include <cv.h>
#include <cxcore.h>
#include <highgui.h>
void myMouseCallBack(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(0x00, 0x00, 0xff)
);
}
int _tmain(int argc, _TCHAR* 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", myMouseCallBack, (void*)image);
while(1)
{
cvCopyImage(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 myMouseCallBack(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;
}
}
结果: