您的位置:首页 > 运维架构

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

2014-09-17 11:01 267 查看
#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);
}
}
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: