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;
}
}
}
}