draw rectangle

//Define out callback which we will install
//for mouse events.
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 onto 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, 0x00)	
		);
}

//draw boxs on the screen.
int _tmain(int argc, _TCHAR* argv[]) {
	box = cvRect(-1, -1, 0, 0);

	IplImage *img = cvCreateImage(
		cvSize(200, 200),
		IPL_DEPTH_8U,
		3
		);

	cvZero(img);

	IplImage *temp = cvCloneImage(img);
	cvNamedWindow("Box Example", CV_WINDOW_AUTOSIZE);

	//Here is the crucial moment that we actually install
	//the callback.Note that we set the value 'param' to
	//be the image we are working with so that the callback
	//will have the image to edit.

	cvSetMouseCallback(
		"Box Example",
		my_mouse_callback,
		(void *)img
		);

	//The main program loop.Here we copy the working image
	//to the 'temp' image, and if the user is drawing,then
	//put the currently contemplated box onto that temp image.
	//Display the temp image,and wait 15ms for a keystroke.

	while(1) {
		//cvCopyImage(img, temp);
		temp = cvCloneImage(img);
		if (draw_box)
			draw_box(temp, box);
		cvShowImage("Box Example", temp);
		if (cvWaitKey(15) == 27)
			break;
	}

	//Be tidy
	cvReleaseImage(&img);
	cvReleaseImage(&temp);
	cvDestroyWindow("Box Example");

	return 0;
}

//This is our mouse callback.If the user
//presses the left button,we start a box.
//When the user releases that button,then
//we add the box to the current image.When
//the mouse is dragged(with the button down)
//we resize the box.

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.width;
				box.width *= -1;
			}
			if (box.height < 0) {
				box.y += box.height;
				box.height *= -1;
			}
			draw_box(image, box);
			}
			break;
	}
}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章