如何从这些图像中提取手部特征?

时间:2018-07-17 18:24:07

标签: python opencv

我有两种不同类型的图像(由于声誉我无法发布,因此已链接它们。):

Image 1 Image 2

我试图使用OpenCV和Python从图像中提取手部特征。哪种看起来像这样:

import cv2
image = cv2.imread('image.jpg')
blur = cv2.GaussianBlur(image, (5,5), 0)
gray = cv2.cvtColor(blur, cv2.COLOR_BGR2GRAY)
retval, thresh1 = cv2.threshold(gray, 70, 255, / cv2.THRESH_BINARY_INV+cv2.THRESH_OTSU)
cv2.imshow('image', thresh1)
cv2.waitKey(0)

结果如下:

Image 1 Image 2

第二张图像的背景变化使cv2.threshold()函数混乱,并且无法正确放置皮肤部位。有办法做到这一点吗?

作为后续问题,提取手部特征的最佳方法是什么?我尝试了HaaR级联,但没有真正得到结果吗?我应该训练自己的瀑布吗?我还有什么其他选择?

1 个答案:

答案 0 :(得分:0)

基于两个图像的样本大小很难说,但是我会尝试使用OpenCV的Integral Channel Features(ChnFtrs),就像增压的Haar功能一样,它可以从颜色以及任何其他图像通道中获取线索乐于创建和提供。

  • 无论如何,您都必须训练自己的瀑布。当然,要拍摄正面和侧面照片,请使用单独的级联。
  • 根据肤色来区分阈值,因为您已经注意到,根据实际对象的肤色和光线,它可能会丢掉部分或全部双手。 ChnFtrs将比固定阈值更强大地为您执行皮肤检测。 (尽管以供将来参考,所有人类实际上都是orange:))
  • 您可以通过仅在希望的手所在的边界框内进行检测来消除一些误报。
  • 尝试同时使用RGB和YUV通道,以了解最有效的方法。您也可以添加边缘检测的结果(例如Canny,将其在3个颜色通道中最大化)以进行良好的测量。最后,您可以根据需要清除未充分使用的通道以保存处理。
  • 如果手部姿势有很大变化,则可能需要对相似的姿势进行分组,并为每组训练一个单独的ChnFtrs级联。各个级联不具有分支结构,因此当正样本在参数空间中不相交时,它们无法很好地应对。 AFAIK,这是一个未开发的区域。

经过正确训练的ChnFtrs级联(或多个)可能会为您提供手的边界框,这将有助于提取手的轮廓,但不能在同一边界框内排除无效轮廓。大多数其他对象检测例程也会遇到此问题。

另一个可能比ChnFtrs更好/更简单的选择是LINEMOD(我的当前最爱)。它的优点是不需要复杂的培训过程,也不需要任何培训时间。