View Code
1 void my_mouse_callback(int event,int x,int y,int flags,void* param); 2 3 CvRect box; 4 5 bool drawing_box=false; 6 7 // a little subroutine to draw a box on to an image 8 void draw_box(IplImage* img,CvRect rect) 9 { 10 cvRectangle(img,cvPoint(box.x,box.y),cvPoint(box.x+box.width,box.y+box.height),cvScalar(0xff,0x00)); 11 } 12 13 14 int main(int argc,char** argv) 15 { 16 box=cvRect(-1,-1,0,0); 17 18 IplImage* image =cvCreateImage(cvSize(200,200),IPL_DEPTH_8U,3); 19 20 cvZero(image); 21 22 IplImage* temp =cvCloneImage(image); 23 24 cvNamedWindow("Box example"); 25 cvNamedWindow("image"); 26 cvSetMouseCallback("Box example",my_mouse_callback,(void*) image); 27 28 while(1){ 29 cvCopyImage(image,temp); 30 /* if(drawing_box) draw_box(image,box); 31 cvShowImage("image",image);*/ 32 if(drawing_box) draw_box(temp,box); 33 cvShowImage("Box example",temp); 34 35 if(cvWaitKey(15)==27) break; 36 } 37 38 cvReleaseImage(&image); 39 cvReleaseImage(&temp); 40 cvDestroyWindow("Box example"); 41 cvDestroyWindow("image"); 42 43 return 0; 44 45 46 } 47 //event 指定鼠标事件类型 48 //int x y 为事件发生时鼠标位置的x,y坐标值。 49 //第四个参数flags 制定了事件在事件发生时的不同状态 50 void my_mouse_callback(int event,int x,int y,int flags,void* param) 51 { 52 IplImage* image= (IplImage*) param; 53 switch(event) 54 { 55 case CV_EVENT_MOUSEMOVE: 56 { 57 if(drawing_box) 58 { 59 box.width=x-box.x; 60 box.height=y-box.y; 61 } 62 } 63 break; 64 case CV_EVENT_LBUTTONDOWN: 65 { 66 drawing_box=true; 67 box=cvRect(x,y,0,0); 68 } 69 break; 70 case CV_EVENT_LBUTTONUP: 71 { 72 drawing_box=false; 73 if(box.width<0) 74 { 75 box.x=box.x+box.width; 76 box.width*=-1; 77 78 } 79 if(box.height<0) 80 { 81 box.y+=box.height; 82 box.height*=-1; 83 } 84 draw_box(image,box); 85 } 86 break; 87 } 88 }