OpenCV 接收鼠标消息——用鼠标画长方形

来源:互联网 发布:sql2005如何导入数据库 编辑:程序博客网 时间:2024/05/17 23:45

创建一幅黑色的图像,显示后,用鼠标在显示窗口中,拖动以画出长方形:

#include "stdafx.h"#include <cv.h>#include <cxcore.h>#include <highgui.h>void myMouseCallBack(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(0x00, 0x00, 0xff));}int _tmain(int argc, _TCHAR* 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", myMouseCallBack, (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");return 0;}void myMouseCallBack(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;}}
结果: