opencv鼠标操作
在opencv的highgui.h中封装了非常实用的鼠标操作,我们可以实时的获取鼠标相对窗口的位置,在将图像布满窗口的时候,获取的坐标就是图像的像素点。
这个操作可以在平常的像素操作程序调试,半自动的图像处理发挥巨大的作用。在opencv中封装了一个回调函数。
什么是回调函数?
回调函数就是一个通过函数指针调用的函数。如果你把函数的指针(地址)作为参数传递给另一个函数,当这个指针被用来调用其所指向的函数时,我们就说这是回调函数。回调函数不是由该函数的实现方直接调用,而是在特定的事件或条件发生时由另外的一方调用的,用于对该事件或条件进行响应。
简单的来讲,回调函数就是可以函数作为一个形参传进另一个函数。
opencv在实现对鼠标的操作是用到了一个回调函数:
void cvSetMouseCallback(
const char* window_name,
CvMouseCallback on_mouse,
void* param=NULL);
其中参数有:window_name,on_mouse,param
window_name很简单,就是窗口的名字。
on_mouse就是对函数进行回调,我们的所有操作都要在这个函数里面进行。
param是可以传出值的自定义变量,默认值为空,可不写。
这样,我们首先先定义一个函数,名字可以随意,最好是清晰一些比如on_click,on_MouseDown。
void onMouse(int Event,int x,int y,int flags,void* param )
{
printf("( %d, %d) ",x,y);
printf("The Event is : %d ",Event);
printf("The flags is : %d ",flags);
printf("The param is : %d\n",param);
}
我们可以写这样一个函数进行回调。
这个函数就可以作为我们操作的测试程序。
这个函数可以在屏幕上显示此时xy坐标,并且可以显示此时的Event和flags值。xy坐标可以理解,图像cols为x,rows为y。而Event和flags则对应着不同的鼠标操作。
用这个函数,我们就可以在主函数中进行回调,并且测试得到不同鼠标操作对应 的Event和flags。
cvSetMouseCallback(“mouse”,onMouse,NULL);
在主函数里面写出这个函数,参数一一对应,我的窗口名就是“mouse”。
事件 | Event | flags |
---|---|---|
鼠标移动 | 0 | 0 |
左键点击 | 1 | 1 |
右键点击 | 2 | 2 |
左键拖动 | 0 | 1 |
右键拖动 | 0 | 2 |
左键弹起 | 4 | 0 |
右键弹起 | 5 | 0 |
滚轮点击 | 3 | 4 |
滚轮弹起 | 6 | 0 |
滚轮滑动 | 0 | 4 |
滚轮按住上滑 | 10 | _>0 |
滚轮按住下滑 | 10 | _<0 |
左右一起点击 | 0 | 3 |
左双击 | 7 | 1 |
右双击 | 8 | 2 |
左键+滚轮 | 3 | 5 |
右键+滚轮 | 3 | 6 |
左键+滚轮+拖动 | 0 | 5 |
右键+滚轮+拖动 | 0 | 6 |
这样我们的测试也就完成了。
下面就可以利用这些点击事件进行操作了。
比如说我要获取我点击时的鼠标坐标,那就可以这样写:
CvMat *pointx=cvCreateMat(2,1000,CV_64FC1);
int i=0;
void onMouse(int Event,int x,int y,int flags,void* param )
{
printf("( %d, %d) ",x,y);
printf("The Event is : %d ",Event);
printf("The flags is : %d ",flags);
printf("The param is : %d\n",param);
if (1==Event&&1==flags)
{
*(pointx->data.db+i)=x;
*(pointx->data.db+pointx->step/8+i)=y;
i++;
}
}
这样矩阵里面获得的就是按下点的坐标,程序就能对其依次进行操作。
reference: