【问题标题】:Finger/Hand Gesture Recognition using Kinect使用 Kinect 进行手指/手势识别
【发布时间】:2014-03-13 17:21:35
【问题描述】:

在解释问题之前,让我先解释一下我的需求。 我期待着一个手动控制的应用程序。 使用手掌导航,使用抓握/拳头点击。

目前,我正在与 Openni 合作,这听起来很有希望,并且在我的案例中很少有示例证明是有用的,因为它在示例中内置了手部跟踪器。这暂时符合我的目的。

我想问的是,

1) 拥有拳头/抓斗检测器的最佳方法是什么?

我在提取的 RGB 数据上训练并使用了 Adaboost 拳头分类器,效果很好,但是它的错误检测太多,无法继续前进。

所以,我在这里再提出两个问题

2) 有没有其他好的库可以使用深度数据来满足我的需求?

3)我们能否训练自己的手势,尤其是使用手指,就像一些论文提到的 HMM 一样,如果可以,我们如何使用 OpenNI 之类的库?

是的,我尝试过使用 OpenNI 中的中间件库,例如抓取检测器,但是它们不能满足我的目的,因为它既不开源也不符合我的需要。

除了我问的以外,如果有什么你认为对我有帮助的东西,将被视为一个好的建议。

【问题讨论】:

  • 您使用什么操作系统来解决这个问题?您是否有机会运行 Mac,或者您使用的是 Windows?

标签: opencv image-processing computer-vision kinect openni


【解决方案1】:

您不需要训练您的第一个算法,因为它会使事情复杂化。 也不要使用颜色,因为它不可靠(与背景混合并根据光照和视点发生不可预测的变化)

  1. 假设您的手是最近的物体,您可以简单地 通过深度阈值将其分割出来。您可以手动设置阈值,使用深度直方图的最近区域,或在深度图上执行connected component 以首先在有意义的部分上打破它(然后不仅根据其深度,还根据其尺寸、运动、用户输入等)。这是连接组件方法的输出:
  2. 从opencv库中应用convex defects来查找手指;

  3. 跟踪手指而不是在 3D 中重新发现它们。这将提高稳定性。大约 3 年前,我成功实现了这种手指检测。

【讨论】:

  • 我有这个实现,我尝试了类似的方式,而不是颜色模式,我尝试了你提到的带有阈值和一些深度范围的凸缺陷,是的,只有手头提取的区域,方法很好,但是,那不是像手骷髅那样生锈。但是,在所有提到的方法中,这看起来是最好的方法,只需稍加修改。
  • 正如他们所说,魔鬼在细节中。您必须探索性能不稳健的情况 - 也许您可以改进您的实施。最终,您可以有一个从多个分析形状返回到预处理和选择阶段的反馈循环,这意味着您的后处理应该告知您原本不完善的预处理应该选择什么。然而,这些循环是危险的,应该在完全理解的情况下完成。
【解决方案2】:

阅读我的论文 :) http://robau.files.wordpress.com/2010/06/final_report_00012.pdf

我已经对手的手势识别进行了研究,并评估了几种对缩放、旋转等具有鲁棒性的方法。您拥有非常有价值的深度信息,因为对我来说最困难的问题是将手从图片。

我最成功的方法是追踪手部的轮廓,并为轮廓上的每个点计算到手部质心的距离。这给出了一组可用作许多训练算法的输入的点。

我使用被分割的手的图像矩来确定它的旋转,所以手轮廓上有一个很好的起点。确定拳头、伸出手和伸出手指的数量非常容易。

请注意,虽然它工作正常,但您的手臂往往会因为指向空中而感到疲倦。

【讨论】:

    【解决方案3】:

    您似乎不知道Point Cloud Library (PCL)。它是一个致力于点云和 RGB-D 数据处理的开源库,它基于 OpenNI 进行低级操作,并提供a lot of high-level algorithm,例如执行注册、分割和识别。

    一种非常有趣的形状/对象识别算法通常称为隐式形状模型。为了检测全局对象(例如汽车或张开的手),首先要检测它的可能部分(例如车轮、行李箱等,或手指、手掌、手腕等)使用局部特征检测器,然后通过考虑其部分的密度和相对位置来推断全局对象的位置。例如,如果我可以在给定区域检测到五个手指、一个手掌和一个手腕,那么我很有可能实际上是在看一只手,但是,如果我在某个地方只检测到一个手指和一个手腕,则可能是一对错误检测。关于这种隐式形状模型算法的学术研究文章可以找到here

    在 PCL 中,有一个 couple 专门针对形状识别主题的教程,幸运的是,其中 one 涵盖了 隐式形状模型,该模型已在 PCL 中实现。我从来没有测试过这个实现,但是从我在教程中看到的,你可以指定你自己的点云来训练分类器。

    话虽如此,您并没有在问题中明确提到它,但由于您的目标是编写一个手控应用程序,您实际上可能对 真正的-时间形状检测算法。您必须测试 PCL 中提供的隐式形状模型的速度,但我认为这种方法更适合离线形状识别。

    如果您确实需要实时形状识别,我认为您应该首先使用手/手臂跟踪算法(通常比完全检测更快)以便知道在图像中查看的位置,而不是尝试执行在 RGB-D 流的每一帧进行完整的形状检测。例如,您可以通过分割深度图(例如,在深度上使用适当的阈值)来跟踪手的位置,然后检测外部。

    然后,一旦您大致知道手在哪里,就应该更容易确定手是否在做出与您的应用程序相关的手势。我不确定您所说的握拳/抓握手势究竟是什么意思,但我建议您定义并使用一些 easyquick 的应用程序控制手势来区分另一个。

    希望这会有所帮助。

    【讨论】:

    • 哦,是的,我听说过,但从没想过实施,你的解释听起来很有吸引力,我一定会研究它,是的,你猜对了,我期待一个实时且强大的检测。我已经有一个非常强大的手部跟踪器,没有比这更好的了,问题在于抓取手势,不清楚的文字,用抓取的手指手势,我想触发点击。你的最后两段是我用 Adaboost 分类器尝试过的,虽然我会尝试用 pcl 来实现它,因为它听起来不错。你认为它适用于一些手指手势,比如竖起大拇指吗?
    • 如果你看一下关于隐式形状模型的 PCL 教程的结尾,你会看到分类器被训练来区分 5 类(包括猫、马、狮子和狼,不是这样的)简单)。因此,如果您的手/手指手势具有足够的辨别力(例如拳头、张开手、拇指向上、拇指向下等),那么这种方法很有可能奏效。无论如何,值得尝试实现。
    • 是的,当然,我会试试这个。
    • PCL 非常有名,很多人都知道它。对象配准适用于创建 3D 模型,并且速度相当慢,而形状建模则适用于识别刚性形状,而不是高度可变形的手。
    • @Vlad True,但是您必须在 OP 的问题中区分两个任务:手部跟踪和手势识别。我同意 隐式形状模型 不适合手部跟踪(我在回答中说过),但它非常适合手势识别。唯一未知的是与实时约束的兼容性。
    【解决方案4】:

    快速的答案是:是的,您可以使用深度数据训练自己的手势检测器。这真的很容易,但这取决于手势的类型。

    假设您要检测手部运动:

    1. 检测手的位置(x,y,x)。使用 OpenNi 非常简单,因为您的手只有一个节点
    2. 执行手势并收集手势期间手的所有位置。
    3. 使用职位列表训练 HMM。例如,您可以使用MatlabCPython
    4. 对于您自己的手势,您可以测试模型并检测手势。

    Here 你可以找到一个很好的教程和代码(在 Matlab 中)。代码(test.m 很容易理解)。这是一个片段:

    %Load collected data
    training = get_xyz_data('data/train',train_gesture);
    testing = get_xyz_data('data/test',test_gesture); 
    
    %Get clusters
    [centroids N] = get_point_centroids(training,N,D);
    ATrainBinned = get_point_clusters(training,centroids,D);
    ATestBinned = get_point_clusters(testing,centroids,D);
    
    % Set priors:
    pP = prior_transition_matrix(M,LR);
    
    % Train the model:
    cyc = 50;
    [E,P,Pi,LL] = dhmm_numeric(ATrainBinned,pP,[1:N]',M,cyc,.00001);
    

    fingers 的处理几乎相同,但不是检测手,而是检测手指。由于 Kinect 没有手指点,因此您需要使用特定代码来检测它们(使用分割或轮廓跟踪)。在herehere 中可以找到一些使用OpenCV 的示例,但最有希望的是具有手指节点的ROS 库(参见示例here)。

    【讨论】:

    • 你给的东西太好了,链接会很有帮助。但是,您的回答主要集中在手上,当我说“抓”时,我的意思是捕捉手指的运动,对不起,我没有深入思考,我应该将问题框定为手指手势。基于手指手势的任何具体建议?因为提到的代码/算法主要处理手部运动而不是特定的手指手势
    • @4nonymou5 检查帖子的编辑。我添加了一个与手指检测相关的有趣参考
    • 是的,我做了类似的事情,使用带有凸包缺陷的深度数据和其他一些东西,这很好,但是无法满足我的需求,但是,ROS的链接看起来很干净,我也会朝那个方向尝试,你的答案看起来令人印象深刻。
    • @4nonymou5 我用 Kinect 做了一些工作,但在深度方面遇到了一些问题。红外摄像机的分辨率不是很好,因此您可能需要考虑到这一点,尤其是在深度移动仅限于手指可以移动多远的情况下。我显然不熟悉您的数据集,但我认为您应该牢记这一点。
    【解决方案5】:

    如果你只需要检测拳头/抓握状态,你应该给微软一个机会。 Microsoft.Kinect.Toolkit.Interaction 包含检测手的抓握/抓握释放状态的方法和事件。看看InteractionHandPointer HandEventType。这对于拳头/抓斗检测非常有效,但不会检测或报告单个手指的位置。

    下一个 kinect(kinect one)检测每只手的 3 个关节(手腕、手、拇指)并具有 3 个基于手的手势:打开、闭合(握/拳头)和套索(指针)。如果这对您来说足够了,您应该考虑使用 microsoft 库。

    【讨论】:

    • 是基于 ToF 的 Kinect 的第二个版本吗?是否有适用于 Linux 的库?
    【解决方案6】:

    1) 如果误检较多,可以尝试扩展分类器的负样本集,重新训练。扩展的负图像集应该包含这样的图像,其中拳头被错误检测到。也许这将有助于创建更好的分类器。

    【讨论】:

    • 是的,这将是一个选择,但是,我认为,包含深度数据可能会在其他算法中增加优势,通过它可以提高准确性。所以,对此更感兴趣。
    【解决方案7】:

    我在使用http://www.threegear.com/ 提供的中间件库方面取得了相当大的成功。它们提供多种手势(包括抓取、捏合和指向)和 6 DOF 手部追踪。

    【讨论】:

      【解决方案8】:

      您可能对本文和开源代码感兴趣:

      用于实时手部跟踪的强大铰接式 ICP

      代码:https://github.com/OpenGP/htrack

      截图:http://lgg.epfl.ch/img/codedata/htrack_icp.png

      YouTube 视频:https://youtu.be/rm3YnClSmIQ

      纸质PDF:http://infoscience.epfl.ch/record/206951/files/htrack.pdf

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-08-07
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多