opencv viz 模块的键盘操作 registerKeyboardCallback

来源:互联网 发布:center os安装windows 编辑:程序博客网 时间:2024/06/07 02:18

opencv中键盘操作比较简单的是imshow中的

在imshow的窗口激活的时候 如果有按键按下 则可以使用waitKey()来获取键盘的键值

当然复杂一点也能使用回调函数来做 之前的博文中已经有相关的介绍了

就不在这里展开了


今天讲一讲最近使用点云显示模块viz时候

需要用一些交互 于是乎发现waitKey()在viz::Viz3d中不能起作用


下面详细说一下 viz中如何使用键盘交互

首先是先创建viz::Viz3d窗口对象

并使用成员函数键盘 - 回调函数

    viz::Viz3d win("Frame");    win.registerKeyboardCallback(KeybdCallback);

然后实现该回调函数中函数指针的具体功能

这里的参数类型是参考了opencv原文中的

KeyboardCallback

typedef void(* cv::viz::Viz3d::KeyboardCallback) (const KeyboardEvent &, void *)


void KeybdCallback(const viz::KeyboardEvent &keyEvent, void *){    if ((keyEvent.action == viz::KeyboardEvent::KEY_DOWN)        && (keyEvent.code == 'a'))    {        printf("press a\n");    }}


再深一点

写成传参的回调函数

    int keyv = 0;    win.registerKeyboardCallback(KeybdCallback, &keyv);

同样,需要实现该回调函数中函数指针的具体功能

void KeybdCallback(const viz::KeyboardEvent &keyEvent, void *val){    int *pKey = (int *)val;    if (keyEvent.action == viz::KeyboardEvent::KEY_DOWN)    {        if (keyEvent.code == 'a')        {            *pKey = 1;            printf("Key 1\n");        }        if (keyEvent.code == 's')        {            *pKey = 2;            printf("Key 2\n");        }        if (keyEvent.code == 'd')        {            *pKey = 3;            printf("Key 3\n");        }    }}

鼠标操作也是一个重要的交互方式

    int keyv = 0;    win.registerMouseCallback(MsCallback, &keyv);

然后是回调函数

这里举例了右键操作的回调

打印鼠标坐标点(以左下角为原点O)

当val==1 则增加为2

void MsCallback(const viz::MouseEvent &mouseEvent, void *val){    int *pMouse = (int *)val;    if (mouseEvent.button == viz::MouseEvent::RightButton)    {        if (mouseEvent.type == viz::MouseEvent::MouseButtonPress)        {            cout << "Point: " << mouseEvent.pointer << endl;                        if (*pMouse == 1)            {                *pMouse = 2;                printf("Key 2\n");                return;            }        }    }}






原创粉丝点击