CvRect box;
void cv_mouse_callback(int event,int x,int y,int flags,void*param);
bool drawing_box=false;//当点击左键时设置为true,表示要进行画方框
void draw_box(IplImage*image,CvRect rect){
cvRectangle(image,cvPoint(box.x,box.y),cvPoint(box.x+box.width,box.y+box.height),cvScalar(0xff,0x00,0x00));
}
int main(int argc,char** argv){
box=cvRect(-1,-1,0,0);
IplImage*image=cvCreateImage(cvSize(300,300),IPL_DEPTH_8U,3);
cvZero(image);//新建图像并进行初始化
IplImage*temp=cvCloneImage(image);//相当于创建和image大小一样的图像
cvNamedWindow("Box Window");
cvSetMouseCallback("Box Window",cv_mouse_callback,image);//注册鼠标事件
while(1){//循环的意思是可以进行多次画方框
cvCopyImage(image,temp);
if(drawing_box)draw_box(temp,box);//当按下鼠标左键时,标识drawing_box为true,可以在图像temp上画矩形
cvShowImage("Box Window",temp);
if(cvWaitKey(15)==27)break;
}
}
void cv_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.height<0&&box.width<0){
box.x+=box.width;
box.y+=box.height;
box.height*=-1;
box.width*=-1;
}
else if(box.height<0){
box.y+=box.height;
box.height*=-1;
}
else if(box.width<0){
box.x+=box.width;
box.width*=-1;
}
draw_box(image,box);
}
break;
}
}
初学opencv
最新推荐文章于 2020-11-11 14:21:07 发布