#include "stdafx.h" #include <iostream> #include <cv.h> #include <highgui.h> using namespace cv; using namespace std; Rect box; bool drawing_box = false; bool gotBB = false; int *initialBB; void mouseHandler(int event, int x, int y, int flags, void *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 = Rect( 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; } gotBB = true; break; } } void drawBox(Mat& image, CvRect box, Scalar color, int thick){ rectangle( image, cvPoint(box.x, box.y), cvPoint(box.x+box.width,box.y+box.height),color, thick); } int _tmain(int argc, _TCHAR* argv[]) { char windowName[1024] = "result"; namedWindow(windowName,CV_WINDOW_AUTOSIZE); VideoCapture capture; capture.open(0); capture.set(CV_CAP_PROP_FRAME_WIDTH,320); capture.set(CV_CAP_PROP_FRAME_HEIGHT,240); Mat frame; cvSetMouseCallback( windowName, mouseHandler, NULL ); GETBOUNDINGBOX: while(!gotBB) { capture>>frame; drawBox(frame,box,Scalar(255,0,0),2); imshow(windowName, frame); if (cvWaitKey(33) == 27) return 0; } if (min(box.width,box.height)<20){ cout << "Bounding box too small, try again." << endl; gotBB = false; goto GETBOUNDINGBOX; } cvSetMouseCallback( windowName, NULL, NULL ); return 0; }