基于opencv的鼠标操作

本文详细介绍了如何使用OpenCV中的回调函数实现鼠标操作,包括如何获取鼠标位置、响应鼠标事件等。并提供了一系列示例代码,帮助读者快速掌握OpenCV中的鼠标交互功能。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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”。

事件Eventflags
鼠标移动00
左键点击11
右键点击22
左键拖动01
右键拖动02
左键弹起40
右键弹起50
滚轮点击34
滚轮弹起60
滚轮滑动04
滚轮按住上滑10_>0
滚轮按住下滑10_<0
左右一起点击03
左双击71
右双击82
左键+滚轮35
右键+滚轮36
左键+滚轮+拖动05
右键+滚轮+拖动06

这样我们的测试也就完成了。
下面就可以利用这些点击事件进行操作了。

比如说我要获取我点击时的鼠标坐标,那就可以这样写:

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:

http://baike.baidu.com/link?url=HlXQng7Y6mJ0l5O5ree05p25ta3J1KSSj9S_Y-J-C_ntXMjM8VJM7XqSvosKFLncvC4NHHo6gJDA59LOgHxwE_

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值