创建一幅黑色的图像,显示后,用鼠标在显示窗口中,拖动以画出长方形:
#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;
}
}结果:
本文介绍了一个使用OpenCV库实现的简单程序,该程序能在黑色背景上通过鼠标操作绘制并实时更新矩形框的位置与大小。代码展示了如何设置鼠标回调函数、跟踪鼠标动作以及在图像上绘制矩形。
3175

被折叠的 条评论
为什么被折叠?



