<一>新手学opencv之cvSetMouseCallback笔记

来源:互联网 发布:adobe软件 mac百度云 编辑:程序博客网 时间:2024/05/16 17:05

       opencv中鼠标操作涉及到第一个函数cvSetMouseCallback。这个函数注册一个回调函数。  使用方法是void cvSetMouseCallback( const char* window_name, CvMouseCallback on_mouse, void*param=NULL );前两个参数分别是窗口名和回调函数。最后一个参数传递给回调函数,方便主程序和回调函数之间进行交换。

       涉及到的第二个函数void my_backcall(int events,int x,int y,int flags,void *pagam),是用户自定义函数,自己写的函数。第一个参数标的鼠标的动作,比如左键按下,左键松开,等等。第二个第三个表示当前鼠标的坐标位置(相对于图片的位置,不是窗口位置)。第四个参数表示附加事件,告诉我们当前按键的情况。第五个参数即是cvSetMouseCallback第三个接收的参数。


     下面程序是 《学习opencv》中的一题,在一幅图片中,鼠标画矩形,并且加亮这个区域。

#include<cv.h>#include<highgui.h>void my_backcall(int events,int x,int y,int flags,void *pagam);int g_isdown=0;void high_light(IplImage *image,CvRect rect);void draw_hist(IplImage *image,CvRect rect);CvRect box;int main(){IplImage *image=cvLoadImage("C:\\Users\\hongbing\\Desktop\\f.jpg");//image保存原图cvNamedWindow("show");IplImage *temp_image=cvCreateImage(cvGetSize(image),image->depth,image->nChannels);//temp_image作为最终被显示的图片   cvCreateImage创建图片并申请内存空间cvSetMouseCallback("show",my_backcall,(void *)temp_image);while(1){//cvCloneImage开辟的内存要记得释放 临时申请temp对其进行操作IplImage *temp=cvCloneImage(image);high_light(temp,box);cvCopyImage(temp,temp_image);cvShowImage("show",temp_image);//temp操作最终结果赋值temp_image并将其显示cvReleaseImage(&temp);if(27==cvWaitKey(30))break;}cvReleaseImage(&image);cvReleaseImage(&temp_image);cvDestroyWindow("show");return 0;}void my_backcall(int events,int x,int y,int flags,void *pagam){IplImage *image=(IplImage *)pagam;switch(events){case CV_EVENT_LBUTTONDOWN://鼠标左键按下{g_isdown=1;box=cvRect(x,y,0,0);}break;case CV_EVENT_MOUSEMOVE://鼠标移动(按着左键移动){if(g_isdown==1){  box.width=x-box.x;  box.height=y-box.y;}}break;case CV_EVENT_LBUTTONUP://鼠标左键松开{g_isdown=0;if(box.width<0)//计算小于0时以下是为了计算high_light中的rect参数{box.x+=box.width;box.width*=-1;}if(box.height<0){box.y+=box.height;box.height*=-1;}}break;}}void high_light(IplImage *image,CvRect rect){int i,j;for(i=box.y;i<box.y+box.height;i++){uchar *ptr=(uchar *)(image->imageData+i*image->widthStep);//当前行的像素位置for(j=box.x;j<box.x+box.width;j++){ptr[(j*3+1)]+=20;ptr[(j*3+2)]+=20;ptr[(j*3+32)]+=20;}}}
参考:《学习opencv》于仕琪,刘瑞祯译;

0 0