【问题标题】:How to detect hand palm and its orientation (like facing outwards)?如何检测手掌及其方向(如朝外)?
【发布时间】:2019-10-07 12:13:18
【问题描述】:

我正在做一个手部检测项目。网上有很多很好的项目可以做到这一点,但我需要的是一个特定的手部姿势检测。它需要一个完全张开的手掌,整个手掌朝外,如下图:

第一只手朝里,所以不会被检测到,右手朝外,会被检测到。现在我可以用 OpenCV 检测手了。但是如何分辨手的方向呢?

【问题讨论】:

  • 我建议训练一个模型(可能是一个带有卷积层的神经网络),这意味着您首先需要有一个“足够大且合适”的数据集,您需要决定如何定义“合适”以及多大就足够了。
  • 这个问题有点离题了。如果您不介意,我建议您分享您目前拥有的代码,以表明您不只是要求我们为您实现一些东西。

标签: ios opencv tensorflow machine-learning computer-vision


【解决方案1】:

使用 Haar-Cascade 分类器, 您可以获取分类器模型文件,然后在此处使用它。 只需搜索“在 Google 中对 Palm 的 Haarcascade 检测”或使用以下代码。

import cv2
cam=cv2.VideoCapture(0)
ccfr2=cv2.CascadeClassifier('haar-cascade-files-master/palm.xml')
while True:
    retval,image=cam.read()
    grey=cv2.cvtColor(image,cv2.COLOR_BGR2GRAY)
    palm=ccfr2.detectMultiScale(grey,scaleFactor=1.05,minNeighbors=3)
    for x,y,w,h in palm:
        image=cv2.rectangle(image,(x,y),(x+w,y+h),(256,256,256),2)
    
    cv2.imshow("Window",image)
    if cv2.waitKey(1) & 0xFF==ord('q'):
        cv2.destroyAllWindows()
        break
del(cam)

祝您使用 HaarCascade 的体验好运。

【讨论】:

    【解决方案2】:

    正手匹配问题属于纹理分类,是经典的模式识别问题。我建议您尝试以下方法之一:

    1. Gabor过滤器:很好的检测方向和像素强度(因为正手有不同的特征),opencv有getGaborKernel函数,这个函数很重要的参数是theta(方向)和lambd : (频率)。为简单起见,您可以将此过程应用于手掌的裁剪区域(因为您已经检测到它,例如拇指或重心周围的矩形区域等很容易裁剪)。然后您可以将其与同一区域的图像的小型数据库进行卷积以获得匹配率,或者您可以使用 SVM 分类器,您必须通过构建所需的训练矩阵在一组图像上训练您的 SVM支持向量机(check this question),这个paper
    2. Lo​​cal Binary Patterns (LBP):它是用于纹理匹配的重要特征描述符,您可以将其应用于整个手掌图像或图像的裁剪区域或手指,在 opencv 中很容易使用,很多教程都带有代码可用于此方法。我建议你阅读这个paper 谈论不变纹理分类 与本地二进制模式。这是一个很好的tutorial
    3. Haralick 纹理:我读到,当一组特征量化整个图像(全局特征描述符)时,它可以完美运行。它没有在opencv中实现但很容易实现,请查看useful tutorial

    4. 训练模型:我已经建议了一个 SVM 分类器,与一些描述符相结合,可以完美运行。 Opencv 有一个有趣的 FaceRecognizer 类用于人脸识别,用手掌替换人脸图像可能是一个有趣的想法,(调整大小和旋转以获得独特的手掌姿势),这个类有三种方法可以使用,其中之一是Local Binary Patterns Histograms,推荐用于纹理识别。以及为什么不尝试其他模型(Eigenfaces 和 Fisherfaces),请查看此tutorial

    【讨论】:

      【解决方案3】:

      看看跳跃蛙对眼裂隙做了什么。我不确定他们在内部使用什么来分割手部姿势,但还有另一篇论文可以有效地产生手部姿势。如果你有立体摄像头设置,可以使用本文的方法:https://arxiv.org/pdf/1610.07214.pdf

      我见过的唯一有前途的解决方案,用于处理大型数据集的单摄像头训练。

      【讨论】:

        【解决方案4】:

        好吧,如果您采用 MacGyver 方式,您会注意到左手的骨头朝某个方向伸出,而右手的所有手指线和手掌中的几条线。

        这些线总是有点相同,因此您可以尝试使用 opencv 边缘检测或霍夫线来检测它们。由于线条的颜色较深,您甚至可以将它们排除在外。然后从这些线中收集信息,例如角度、回归,看看您可以收集哪些特征并训练一个简单的决策树。

        这是假设你没有足够的数据,如果你有,那么你就进入深度学习,只需要一个基本的 inceptionV3 模型并重新训练最后一个密集层以使用 softmax 在两个类之间进行分类,或者预测概率,如果手用 sigmoid 向上/向下。检查this link,Tensorflow 让你支持了这一训练,纯粹的已经准备好执行的代码。

        问题?问一下

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2013-04-09
          • 2022-07-04
          • 2018-07-29
          • 2017-12-13
          • 2013-08-03
          • 1970-01-01
          • 2015-08-03
          • 1970-01-01
          相关资源
          最近更新 更多