OpenCV之响应鼠标(四):在图像上绘制出矩形并标出起点的坐标
涉及到两方面的内容:1. 用鼠标画出矩形。2.在图像上绘制出点的坐标
- 用鼠标绘制矩形,涉及到鼠标的操作,opencv中有鼠标事件的介绍。需要用到两个函数:回调函数CvMouseCallback和注册回调函数cvSetMouseCallback.
当回调函数被调用时,opencv会传入合适的值,当鼠标有动作时,有所反应,比如画线,描点。
void CvMouseCallback(int event,int x,int y,int flags,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可以以任何结构方式传递额外的参数信息。
void cvSetMouseCallback(const char* window_name,CvMouseCallback on_mouse,void* param);
第一个参数指定了回调函数需要注册到的窗口,也就是产生事件的窗口。第二个参数为回调函数,第三个参数用来传递额外信息给回调函数中的param参数。
- 在图像上绘出点的坐标涉及到opencv中的绘图中的字体和文字。主要有函数cvPutText和cvInitFont.
void cvPutText(CvArr* img,const char* text,CvPoint origin,const CvFont* font,CvScalar clolor);
这个函数可以在图像上输出一些文本。
text所指向的文本将打印到图像上。若将点的坐标打印到图像上,就需要把点的坐标变成字符串,要用到sprintf函数。
Origin为指定文本框的左下角位置。
Void cvInitFont(CvFont* font,int font_face,double hscale,double vscale,double shear=0,int thinckness=1,int line_type=8);
hscale和vscale表示字体的高度和宽度。Shear=0.0字体不倾斜,shear=1.0,字体倾斜。
Opencv程序和结果如下所示。
#include <opencv2/opencv.hpp> #include <iostream> #include <cmath> #include <cstring> using namespace std; void my_mouse_callback(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)); } CvFont font; int main() { 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->width<<" "<<image->height<<"**"<<endl; //cvZero(image); IplImage* temp=cvCloneImage(image); cvNamedWindow("Box Example"); cvSetMouseCallback("Box Example",my_mouse_callback,(void*)image); while(1) { cvCopy(image,temp); if(drawing_box) draw_box(temp,box); cvShowImage("Box Example",temp); if(cvWaitKey(30)==27) break; } cvSaveImage("temp.jpg",temp); cvReleaseImage(&image); cvReleaseImage(&temp); cvDestroyWindow("Box Example"); 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); cout<<box.x<<" "<<box.y<<endl; } break; case CV_EVENT_LBUTTONUP: { drawing_box=false; draw_box(image,box); cout<<box.x<<" "<<box.y<<"&&"<<box.width<<" "<<box.height<<endl; char s1[32]; char s2[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; } }
实验结果:
posted on 2015-09-15 16:40 realkate1 阅读(2073) 评论(0) 编辑 收藏 举报