// 鼠标绘图#includeusing namespace std;//#pragma comment(linker, "/subsystem:\"windows\" /entry:\"mainCRTStartup\"")const char *pstrWindowsMouseDrawTitle = "鼠标绘图窗口";/** 鼠标事件响应采用回调函数的方式处理,即为了响应鼠标点击事件,首先必须创建一个回调函数,使鼠标点击事件发生时,opencv可以调用这个函数创建这个回调函数后,需要在opencv中注册这个函数(用cvSetMouseCallback(回调函数需要注册的窗口,要调用的回调函数,要传递的额外信息)来注册),以便特定窗口被触发鼠标事件后,opencv可以正确调用这个函数。回调函数的格式:void CvMouseCallback(int event(鼠标事件类型{}),int x(鼠标事件发生时的x坐标),int y(鼠标事件发生时的y坐标), int flags(鼠标事件的标志{}),void* param(用于传递额外的参数信息给前面所创建的回调函数的void * param));event鼠标事件类型: CV_EVENT_MOUSEMOVE(0)鼠标滑动 CV_EVENT_LBUTTONDOWN(1)左键点击 CV_EVENT_RBUTTONDOWN(2)右键点击 CV_EVENT_MBUTTONDOWN(3)中键点击 CV_EVENT_LBUTTONUP(4)左键放开 CV_EVENT_RBUTTONUP(5)右键放开 CV_EVENT_MBUTTONUP(6)中键放开 CV_EVENT_LBUTTONDBLCLK(7)左键双击 CV_EVENT_RBUTTONDBLCLK(8)右键双击 CV_EVENT_MLBUTTONDBLCLK(9)中键双击flags鼠标事件标记 CV_EVENT_FLAG_LBUTTON(1)左键拖拽 CV_EVENT_FLAG_RBUTTON(2)右键拖拽 CV_EVENT_FLAG_MBUTTON(3)中键拖拽 CV_EVENT_FLAG_CTRLKEY(8)[8-15]按Ctrl键不放 CV_EVENT_FLAG_SHIFTKEY(16)[16-31]按shift键不放 CV_EVENT_FLAG_ALTKEY(32)[32-39]按Alt键不放**/// 鼠标消息的回调函数void on_mouse(int event, int x, int y, int flags, void* param){ static bool s_bMouseLButtonDown = false; static CvPoint s_cvPrePoint = cvPoint(0, 0);//坐标二维点 switch (event)//鼠标消息类型 { case CV_EVENT_LBUTTONDOWN: s_bMouseLButtonDown = true; s_cvPrePoint = cvPoint(x, y); break; case CV_EVENT_LBUTTONUP: s_bMouseLButtonDown = false; break; case CV_EVENT_MOUSEMOVE: if (s_bMouseLButtonDown) { CvPoint cvCurrPoint = cvPoint(x, y); //void cvLine( CvArr* img(图像), CvPoint pt1(线段的第一个端点), CvPoint pt2(线段的第二个端点), CvScalar color(线段颜色), int thickness=1(线段粗细), int line_type=8(线段类型), int shift=0(坐标点的小数位数) ); cvLine((IplImage*)param, s_cvPrePoint, cvCurrPoint, CV_RGB(255, 255, 255), 3);//这里的 CV_RGB()用来定义画笔的颜色 s_cvPrePoint = cvCurrPoint; cvShowImage(pstrWindowsMouseDrawTitle, (IplImage*)param); } break; }}int main(){ const int MAX_WIDTH = 400, MAX_HEIGHT = 400;//设定画布大小 const char *pstrSaveImageName = "MouseDraw.jpg";//要保存的这幅画的文件名 IplImage *pSrcImage = cvCreateImage(cvSize(MAX_WIDTH, MAX_HEIGHT), IPL_DEPTH_8U, 3);//创建一副空的图像 cvSet(pSrcImage, CV_RGB(25, 100, 125)); //可以用cvSet()将图像填充成白色(255,255,255),或是其他的颜色,只要改变CV_RGB(, ,)的三个参数即可。 //显示这幅空白图片 cvNamedWindow(pstrWindowsMouseDrawTitle, CV_WINDOW_AUTOSIZE);//cvNamedWindow(视窗名称,0(视窗大小可以手动调整)或1(又可以用CV_WINDOW_AUTOSIZE来代替,表示视窗大小随载入图片的大小而自动调整并且不能手动调整)) cvShowImage(pstrWindowsMouseDrawTitle, pSrcImage);//cvShowImage(指向显示图像的窗口,指向要显示的图像); //实现注册的函数 cvSetMouseCallback(pstrWindowsMouseDrawTitle, on_mouse, (void*)pSrcImage); int c; do{ c = cvWaitKey(0);//cvWaitKey(0)表示opencv无期限的等待,直到用户触发一个按键。cvWaitKey(100)表示等待100ms switch ((char)c) { case 'r'://‘r’键可以重新绘图【在无期限的等待后,用户触发了'r'键,则执行这个case操作】 cvSet(pSrcImage, CV_RGB(255, 255, 255)); cvShowImage(pstrWindowsMouseDrawTitle, pSrcImage); break; case 's'://按下‘s’键则保存图片到磁盘中 cvSaveImage(pstrSaveImageName, pSrcImage);//cvSaveImage(将要保存的图片的名称,要存储的图像的数据),它只能存储8位单通道或是8位3个通道格式的图像 break; } }while (c > 0 && c != 27);//Esc的ASCII=27 //释放空间 cvDestroyWindow(pstrWindowsMouseDrawTitle); cvReleaseImage(&pSrcImage); return 0;}
参考博文:http://blog.csdn.net/morewindows/article/details/8426283。