您的位置:首页 > 运维架构

OpenCV_用鼠标在窗口画方形

2011-09-30 15:54 260 查看
View Code

void my_mouse_callback(int event,int x,int y,int flags,void* param);

CvRect box;

bool drawing_box=false;

// a little subroutine to draw a box on to an image
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));
}

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");
cvNamedWindow("image");
cvSetMouseCallback("Box example",my_mouse_callback,(void*) image);

while(1){
cvCopyImage(image,temp);
/*    if(drawing_box) draw_box(image,box);
cvShowImage("image",image);*/
if(drawing_box) draw_box(temp,box);
cvShowImage("Box example",temp);

if(cvWaitKey(15)==27) break;
}

cvReleaseImage(&image);
cvReleaseImage(&temp);
cvDestroyWindow("Box example");
cvDestroyWindow("image");

return 0;

}
//event 指定鼠标事件类型
//int x y 为事件发生时鼠标位置的x,y坐标值。
//第四个参数flags 制定了事件在事件发生时的不同状态
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.x+box.width;
box.width*=-1;

}
if(box.height<0)
{
box.y+=box.height;
box.height*=-1;
}
draw_box(image,box);
}
break;
}
}


内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: