基于opencv用鼠标在窗口中画矩形和线段的程序

#include "cv.h"
#include "highgui.h"
#include using namespace std;
CvRect box;
bool drawing_box = false;
void my_mouse_callback(int events, int x, int y, int flags, void *param);
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, 0xff, 0x00) //color
					);
}
void draw_line(IplImage *img, CvRect rect) {
	cvLine(img, cvPoint(box.x, box.y),
			cvPoint(box.x + box.width, box.y + box.height),
			cvScalar(255, 255, 0));
}
int main() {
	box = cvRect(0, 0, 100, 100);
	IplImage *image = cvCreateImage(cvSize(1000, 800), IPL_DEPTH_8U, 3);
	cvZero(image);
	draw_box(image, box);
	cvRectangle(image, cvPoint(100, 100), cvPoint(150, 200),
			cvScalar(255, 255, 255));
	cvLine(image, cvPoint(200, 100), cvPoint(150, 200), cvScalar(255, 255, 0));
	IplImage * temp = cvCloneImage(image);
	cvNamedWindow("box example");
	cvSetMouseCallback("box example", my_mouse_callback, (void *) image);
	while (1) {
		cvCopyImage(image, temp);
		//将image复制到temp,保证了循环中不停的画矩形而不显示痕迹
		if (drawing_box) //,鼠标左键按下时,能实时显示矩形框的形状
		{
			draw_box(temp, box);
			draw_line(temp, box);
		}
		cvShowImage("box example", temp);
		if (cvWaitKey(15) == 27)
			break;
	}
	cvReleaseImage(&image);
	cvReleaseImage(&temp);
	cvDestroyWindow("box example");
	return 0;
} 
//鼠标事件回调函数,格式:CvMouseCallback(int event,int x,int y,int flags,void *param)
void my_mouse_callback(int events, int x, int y, int flags, void *param) {
	IplImage *image = (IplImage *) param;
	if (flags == 16) //CV_EVENT_FLAGS_SHIFTKEY = 16,如果shift键按下,则清屏
		cvZero(image);
	switch (events) {
	case CV_EVENT_MOUSEMOVE: {
		if (drawing_box) {
			box.width = x - box.x;
			box.height = y - box.y;
		}
	}
		break;
	case CV_EVENT_LBUTTONUP: {
		drawing_box = false;
		cout << "height = " << box.height << endl;
		cout << "width = " << box.width << endl;
		/*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);
		draw_line(image, box);
	}
		break;
	case CV_EVENT_LBUTTONDOWN: {
		drawing_box = true;
		box = cvRect(x, y, 0, 0);
	}
	}
}
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值