Opencv学习笔记——画矩形

来源:互联网 发布:泛型编程与stl 编辑:程序博客网 时间:2024/05/18 03:04

通过Opencv自带的函数功能cvRectangle来实现用鼠标画矩形,具体代码如下:

#include "stdio.h"#include "highgui.h"#include "cv.h"void my_mouse_callback(int event,int x,int y,int flags,void *param);CvRect box;/*typedef struct CvRect{    int x;    int y;    int width;    int height;}CvRect;*/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));/*函数原型:void cvRectangle( CvArr* img, CvPoint pt1, CvPoint pt2, CvScalar color,int thickness=1, int line_type=8, int shift=0 );参数介绍:img -- 图像.pt1 -- 矩形的一个顶点。pt2 -- 矩形对角线上的另一个顶点color -- 线条颜色 (RGB) 或亮度(灰度图像 )(grayscale image)。thickness -- 组成矩形的线条的粗细程度。取负值时(如 CV_FILLED)函数绘制填充了色彩的矩形。line_type -- 线条的类型。见cvLine的描述shift -- 坐标点的小数点位数。*/}int main(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);//clone是把所有的都复制过来,也就是说不论你是否设置Roi,Coi等影响copy的参数,clone都会原封不动的克隆过来。    //copy就不一样,只会复制ROI区域等。用clone复制之后,源图像在内存中消失后,复制的图像也变了,而用copy复制,源图像消失后,复制的图像不变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)//接收到ESC按键{break;}}cvReleaseImage(&image);cvReleaseImage(&temp);cvDestroyWindow("Box Example");printf("Hello World!\n");return 0;}//响应画矩形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;}}


0 0
原创粉丝点击