OpenCV中鼠标事件的响应是采用回调函数的方式来处理。即为了响应鼠标点击事件,必须首先创建一个鼠标回调函数,使鼠标点击事件发生时OpenCV可以调用该函数。创建这个函数后,需要在OpenCV中注册这个函数,以便将特定的窗口与鼠标回调函数绑定。
鼠标回调函数的形式:
void cvMouseCallback(int mouseEvent,int x,int y,int flags,void* param);
其中 int mouseEvent 是鼠标事件类型,是用宏定义的一些int型:
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_MBUTTONDBLCLK=9
x,y表示鼠标事件发生时鼠标的坐标位置;
int flags,每一位指定了附加状态:
CV_EVENT_FLAG_LBUTTON=1,
CV_EVENT_FLAG_RBUTTON=2,
CV_EVENT_FLAG_MBUTTON=4,
CV_EVENT_FLAG_CTRLKEY=8,
【opencv|Learing OpenCV---鼠标响应】CV_EVENT_FLAG_SHIFTKEY=16,
CV_EVENT_FLAG_ALTKEY=32
鼠标回调函数的注册:
void cvSetMouseCallback( const char* window_name, CvMouseCallback on_mouse, void* param=NULL );
其中:
const char* window_name表示所要绑定窗口名
CvMouseCallback on_mouse表示鼠标回调函数,此参数传入回调函数的地址(函数名相当于函数地址),不要带小括号(表示函数调用)
void* param=NULL 用户定义传入鼠标指定消息处理函数的参数
附:鼠标拖动画矩形的源代码
const char* window_name表示所要绑定窗口名
CvMouseCallback on_mouse表示鼠标回调函数,此参数传入回调函数的地址(函数名相当于函数地址),不要带小括号(表示函数调用)
void* param=NULL 用户定义传入鼠标指定消息处理函数的参数
#include
#include
#include
using namespace std;
CvRect box;
//定义2个全局变量
bool drawing_box=false;
void my_mouse_callback(int event,int x,int y,int flag,void *param);
//鼠标回调函数申明
void draw_box(IplImage *img,CvRect box);
//画矩形声明
int main()
{ box=cvRect(-1,-1,0,0);
const char *windowName="Box test";
IplImage *image=cvCreateImage(cvSize(400,400),IPL_DEPTH_8U,3);
cvZero(image);
IplImage *tempImg=cvCloneImage(image);
cvNamedWindow(windowName,0);
cvMoveWindow(windowName,100,100);
cvSetMouseCallback(windowName,my_mouse_callback,(void*)image);
//注册鼠标回调函数 while(1)
{
cvCopyImage(image,tempImg);
if (drawing_box)
{
draw_box(tempImg,box);
}
cvShowImage(windowName,tempImg);
if (27==cvWaitKey(200))//按下Esc程序退出
{
break;
}
}
cvReleaseImage(&image);
cvReleaseImage(&tempImg);
cvDestroyWindow(windowName);
}
void my_mouse_callback(int event,int x,int y,int flag,void *param)
{
IplImage *image=(IplImage*)param;
switch(event)
{
case CV_EVENT_LBUTTONDOWN:
{
drawing_box=true;
//左键按下时drawing_box=ture,可以画图
box=cvRect(x,y,0,0);
//同时给出box的左上角x,y 宽高为0
}
break;
case CV_EVENT_MOUSEMOVE:
{
if (drawing_box)
{
box.width=x-box.x;
//移动时给出width,height
box.height=y-box.y;
}
}
break;
case CV_EVENT_LBUTTONUP:
{
drawing_box=false;
//左键松开时drawing_box=false
if (box.width<=0)//如何向左上角拖动鼠标,重新给box的x,y,width,height赋值
{
box.x+=box.width;
box.width*=-1;
}
if (box.height<=0)
{
box.y+=box.height;
box.height*=-1;
}
draw_box(image,box);
//松开时画矩形
}
break;
}
}
void draw_box(IplImage *img,CvRect box)//在一个mat上画矩形
{
cvRectangle(img,cvPoint(box.x,box.y),cvPoint(box.x+box.width,box.y+box.height),cvScalar(200));
}
运行结果:
文章图片
推荐阅读
- OpeenCV(python)|openCV专栏(一)(基础操作)
- OpenCV|opencv3/python 鼠标响应操作
- opencv|opencv学习笔记(二) 图像腐蚀和膨胀
- opencv|opencv学习笔记(四) 绘制几何图形
- opencv|opencv 学习笔记(五) findContours() 函数与drawContours() 函数
- opencv|opencv 学习笔记(六) 一周总结
- opencv|opencv学习笔记(三)颜色转换 cvtColor
- opencv|opencv 图片上画一条线
- opencv|opencv 学习笔记(一) 矩阵构造之输出