OpenCV学习笔记-用鼠标在窗口中画矩形

程序如下:

// drawBox.cpp : 定义控制台应用程序的入口点。
//

#include "stdafx.h"
#include "cv.h"
#include "highgui.h"


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

CvRect box;
bool drawing_box=false;
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) /*red*/
		);
}


int _tmain(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");
	cvSetMouseCallback(
		"Box Example",
		my_mouse_callback,
		(void *)image
		);
	while(1)
	{
		cvCopyImage(image,temp);
		if(drawing_box)draw_box(temp,box);
		cvShowImage("Box Example",temp);
		if(cvWaitKey(15)==27) break;
	}
	cvReleaseImage(&image);
	cvReleaseImage(&temp);
	cvDestroyWindow("Box Example");
}


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;
	}
}


运行结果如图:
OpenCV学习笔记-用鼠标在窗口中画矩形_第1张图片


参考文献:

学习OpenCV(中文版)于仕祺 刘瑞祯 译  清华大学出版社  pp:114-117.

你可能感兴趣的:(image,callback,出版)