Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/opencv/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/image-processing/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/jsf/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Opencv 基于Kinect的手指/手势识别_Opencv_Image Processing_Computer Vision_Kinect_Openni - Fatal编程技术网

Opencv 基于Kinect的手指/手势识别

Opencv 基于Kinect的手指/手势识别,opencv,image-processing,computer-vision,kinect,openni,Opencv,Image Processing,Computer Vision,Kinect,Openni,在我解释问题之前,让我先解释一下我的需要。 我期待一个手动控制的应用程序。 使用手掌导航,使用抓取/拳头单击 目前,我正在与Openni合作,它听起来很有希望,而且在我的案例中几乎没有有用的示例,因为它在示例中有内置的手跟踪程序。这符合我目前的目的 我想问的是 1)使用拳头/抓斗探测器的最佳方法是什么? 我在提取的RGB数据上训练并使用Adaboost fist分类器,这很好,但是,它有太多错误检测,无法继续 所以,这里我再提出两个问题 2)是否有其他好的库能够使用深度数据满足我的需求? 3)我

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

目前,我正在与Openni合作,它听起来很有希望,而且在我的案例中几乎没有有用的示例,因为它在示例中有内置的手跟踪程序。这符合我目前的目的

我想问的是

1)使用拳头/抓斗探测器的最佳方法是什么?

我在提取的RGB数据上训练并使用Adaboost fist分类器,这很好,但是,它有太多错误检测,无法继续

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

2)是否有其他好的库能够使用深度数据满足我的需求?

3)我们可以训练自己的手势吗,特别是使用手指,因为有些文章提到了HMM,如果可以,我们如何使用OpenNI这样的库?

是的,我尝试了OpenNI中的中间件库,比如抓取检测器,但是,它们不符合我的目的,因为它既不开源,也不符合我的需要


除了我所问的,如果你认为有什么可以帮助我的,我会接受为一个好的建议。

1)如果有很多错误检测,你可以尝试扩展分类器的阴性样本集,并再次训练它。扩展的负片图像集应该包含这样的图像,其中拳头被错误检测到。也许这将有助于创建一个更好的分类器。

您似乎不知道。它是一个开源库,专门用于处理点云和RGB-D数据,它基于OpenNI进行底层操作,并提供注册、分割和识别等功能

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

在PCL中,有许多教程专门讨论形状识别的主题,幸运的是,其中包括隐式形状模型,该模型已在PCL中实现。我从未测试过这个实现,但是从我在教程中读到的内容来看,您可以指定自己的点云来训练分类器

尽管如此,您在问题中并未明确提及,但由于您的目标是编写一个手控应用程序,实际上您可能对实时形状检测算法感兴趣。您必须测试PCL中提供的隐式形状模型的速度,但我认为这种方法更适合脱机形状识别

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

然后,一旦您大致知道了手的位置,就应该更容易确定手是否正在做出与您的应用程序相关的一个手势。我不确定你所说的拳头/抓取手势的确切含义,但我建议你定义并使用一些应用程序控制手势,它们是简单的快速的,以便相互区别


希望这有帮助。

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

假设要检测手的移动:

  • 检测手的位置
    (x,y,x)
    。使用OpenNi非常方便,因为手上只有一个节点
  • 执行手势并收集手势过程中手的所有位置
  • 使用位置列表训练HMM。例如,您可以使用,或
  • 对于您自己的手势,您可以测试模型并检测手势
  • 您可以找到一个很好的教程和代码(在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);
    

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

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

  • 假设你的手是最近的物体,你可以 按深度阈值进行分割。您可以手动设置阈值,使用深度直方图的最近区域,或者在深度贴图上执行操作,首先在有意义的部分上对其进行打断(然后不仅根据对象的深度,还使用其尺寸、运动、用户输入等来选择对象)。这是连接的输出