我在哪里可以学习/找到使用OpenCV从Kinect流式传输的手势识别示例?

Rom*_*gan 7 algorithm opencv gesture-recognition kinect

我有适用于Windows和MacOSX的Kinect和驱动程序.是否有任何使用OpenCV API从Kinect流式传输的手势识别示例?我试图在Xbox Kinect上实现类似于DaVinci原型,但在Windows和MacOSX中.

Jul*_*éon 15

链接中的演示似乎没有使用真正的手势识别.它只是区分两个不同的手位置(打开/关闭),这更容易,并跟踪手的位置.考虑到他在演示中握手的方式(在身体前方,当他们打开时面对kinect),这可能是他正在做的事情.由于您没有精确使用您使用的语言,我将在openCV中使用C函数名称,但它们在其他语言中应该类似.我还假设您可以从kinect获取深度图(如果使用libfreenect,可能通过回调函数).

  1. 深度阈值选择仅足够接近的点(手).您可以自己实现,也可以直接使用openCV来获取二进制图像(带CV_THRESH_BINARY的cvThreshold()).显示阈值后获得的图像并调整阈值以适合您的配置(尽量避免太靠近kinect,因为此区域有更多干扰).

  2. 用cvFindContour()获取手的轮廓

这个基础.既然你有手的轮廓,根据你想要做什么,你可以采取不同的方向.如果您只想在手动打开和关闭之间进行检测,您可以执行以下操作:

  1. 使用cvConvexHull2()获取手的凸包

  2. 使用cvConvexityDefect()在轮廓和之前获得的凸包上获得凸性缺陷.

  3. 分析凸度缺陷:如果有大的缺陷,手是打开的(因为手指之间的形状是凹的),如果不是手被关闭.

但你也可以做手指检测!这就是我上周所做的,这不需要太多的努力,可能会提升你的演示!一种便宜但非常可靠的方法是:

  1. 用多边形近似手轮廓.在轮廓上使用cvApproxPoly().您必须调整精度参数以使多边形尽可能简单但不会将手指混合在一起(大约15个应该非常好,但是使用cvDrawContours()在您的图像上绘制它以检查您获得的内容) .

  2. 分析轮廓以找到尖锐的凸角.你必须手工完成.这是最棘手的部分,因为:

    • openCV中使用的数据结构起初可能有点令人困惑.如果你对CvSeq结构过于挣扎,cvCvtSeqToArray()可能会有所帮助.
    • 你最终会做一些(基本的)数学来找到凸角.请记住,您可以使用点积来确定角度的锐度,以及用于区分凸角和凹角的矢量乘积.
  3. 在这里,尖锐的凸角是你的指尖!

这是一种检测手指的简单算法,但有很多方法可以提升它.例如,您可以尝试在深度图上应用中值滤波器以"平滑"一切,或者尝试使用更精确的多边形近似,然后过滤轮廓以合并要在指尖上关闭的点等. .

祝好运并玩得开心点!


小智 -1

我认为不会这么简单,主要是因为kinect的深度图像数据不是那么敏感。因此,在距离 1m 到 1.5m 后,所有手指都会合并,因此您将无法获得清晰的轮廓来检测手指

  • 在 1.5m 的距离处,我仍然可以在 kinect 上看到我的手指。另请注意,在 OP 分享的视频中,演示者比这更接近。最后,这如何回答这个问题? (2认同)