您好,欢迎访问三七文档
当前位置:首页 > 商业/管理/HR > 管理学资料 > opencv在图像上绘制出矩形并标出起点的坐标
在图像上绘制出矩形并标出起点的坐标涉及到两方面的内容:1.用鼠标画出矩形。2.在图像上绘制出点的坐标1.用鼠标绘制矩形,涉及到鼠标的操作,opencv中有鼠标事件的介绍。需要用到两个函数:回调函数CvMouseCallback和注册回调函数cvSetMouseCallback.当回调函数被调用时,opencv会传入合适的值,当鼠标有动作时,有所反应,比如画线,描点。voidCvMouseCallback(intevent,intx,inty,intflags,void*param);event为鼠标事件类型,值为以下一种:CV_EVENT_MOUSEMOVE,CV_EVENT_LBUTTONDOWN,CV_EVENT_RBUTTONDOWN,CV_EVENT_MBUTTONDOWN,CV_EVENT_RBUTTONUP,CV_EVENT_LBUTTONUP,CV_EVENT_MBUTTONUP,CV_EVENT_LBUTTONBLCLK,CV_EVENT_RBUTTONBLCLK,CV_EVENT_MBUTTONBLCLK.x,y表示事件发生时鼠标位置的x,y坐标值。flags的值表示了别的键如ctrl,shift键是否被触发。Param可以以任何结构方式传递额外的参数信息。voidcvSetMouseCallback(constchar*window_name,CvMouseCallbackon_mouse,void*param);第一个参数指定了回调函数需要注册到的窗口,也就是产生事件的窗口。第二个参数为回调函数,第三个参数用来传递额外信息给回调函数中的param参数。2.在图像上绘出点的坐标涉及到opencv中的绘图中的字体和文字。主要有函数cvPutText和cvInitFont.voidcvPutText(CvArr*img,constchar*text,CvPointorigin,constCvFont*font,CvScalarclolor);这个函数可以在图像上输出一些文本。text所指向的文本将打印到图像上。若将点的坐标打印到图像上,就需要把点的坐标变成字符串,要用到sprintf函数。Origin为指定文本框的左下角位置。VoidcvInitFont(CvFont*font,intfont_face,doublehscale,doublevscale,doubleshear=0,intthinckness=1,intline_type=8);hscale和vscale表示字体的高度和宽度。Shear=0.0字体不倾斜,shear=1.0,字体倾斜。Opencv程序和结果如下所示。#includeopencv2/opencv.hpp#includeiostream#includecmath#includecstringusingnamespacestd;voidmy_mouse_callback(intevent,intx,inty,intflags,void*param);CvRectbox;booldrawing_box=false;voiddraw_box(IplImage*img,CvRectrect){cvRectangle(img,cvPoint(box.x,box.y),cvPoint(box.x+box.width,box.y+box.height),cvScalar(0x00,0x00,0xff));}CvFontfont;intmain(){cvInitFont(&font,CV_FONT_HERSHEY_SIMPLEX,0.4,0.4,0,1,8);box=cvRect(-1,-1,0,0);IplImage*image=cvLoadImage(1.bmp);cout**image-widthimage-height**endl;//cvZero(image);IplImage*temp=cvCloneImage(image);cvNamedWindow(BoxExample);cvSetMouseCallback(BoxExample,my_mouse_callback,(void*)image);while(1){cvCopy(image,temp);if(drawing_box)draw_box(temp,box);cvShowImage(BoxExample,temp);if(cvWaitKey(30)==27)break;}cvSaveImage(temp.jpg,temp);cvReleaseImage(&image);cvReleaseImage(&temp);cvDestroyWindow(BoxExample);return0;}voidmy_mouse_callback(intevent,intx,inty,intflags,void*param){IplImage*image=(IplImage*)param;switch(event){caseCV_EVENT_MOUSEMOVE:{if(drawing_box){box.width=x-box.x;box.height=y-box.y;}}break;caseCV_EVENT_LBUTTONDOWN:{drawing_box=true;box=cvRect(x,y,0,0);coutbox.xbox.yendl;}break;caseCV_EVENT_LBUTTONUP:{drawing_box=false;draw_box(image,box);coutbox.xbox.y&&box.widthbox.heightendl;chars1[32];chars2[32];sprintf(s1,(%d,%d),box.x,box.y);sprintf(s2,%d,box.y);cvPutText(image,s1,cvPoint(box.x,box.y),&font,CV_RGB(0,0,255));}break;}}实验结果:
本文标题:opencv在图像上绘制出矩形并标出起点的坐标
链接地址:https://www.777doc.com/doc-7366973 .html