如何检测手掌及其方向(例如朝外)?

时间:2019-05-21 06:46:25

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

我正在研究手部检测项目。网络上有很多不错的项目可以做到这一点,但我需要的是特定的手部姿势检测。它需要一个完全张开的手掌,并且整个手掌朝外,如下图所示:
left hand will not be detected

第一只手面向内,因此不会被检测到,而右手则面向外,它将被检测到。现在,我可以使用OpenCV检测到手了。但是如何知道手的方向呢?

4 个答案:

答案 0 :(得分:1)

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

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

  4. 训练模型:我已经建议将SVM分类器与一些描述符结合使用,可以很好地工作。 Opencv有一个有趣的FaceRecognizer类用于人脸识别,用它代替手掌的人脸图像可能是一个有趣的主意(进行大小调整和旋转以获得手掌的唯一姿势),该类有三种使用方法,其中之一是“本地二进制图案直方图”,建议用于纹理识别。以及为什么不尝试其他模型(Eigenfaces和Fisherfaces),请检查此tutorial

答案 1 :(得分:0)

看看跳蛙对oculus裂谷做了什么。我不确定他们在内部使用什么来分割手势,但是还有另一篇论文可以有效地生成手势。如果您有立体相机设置,则可以使用本文的方法:https://arxiv.org/pdf/1610.07214.pdf

我在大型数据集上看到的单机摄像机训练的唯一有前途的解决方案。

答案 2 :(得分:0)

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

这些行始终是相同的,因此您可以尝试使用opencv边缘检测或粗线来检测它们。由于线条颜色较深,您甚至可以将它们限制在其中。然后从这些线中收集信息,例如角度,回归,查看可以收集和训练简单决策树的功能。

那是假设您没有足够的数据,如果您有然后进行深度学习,则只需采用基本的inceptionV3模型并重新训练最后一个密集层,以使用softmax在两个类之间进行分类,或者预测概率乙状结肠。选中this link,Tensorflow会帮助您接受这一已经完全可以执行的纯代码的培训。

有问题吗?问走

答案 3 :(得分:0)

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

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 的体验好运。