我正在进行一个手部检测项目。网上有很多优秀的项目可以实现这个功能,但我的需求是特定的手部姿势检测。需要完全张开的手掌,并且手掌整体朝外,就像下图所示:
第一只手朝内,因此不会被检测到,而右边的那只手朝外,将会被检测到。现在我可以使用OpenCV检测手部,但如何判断手部的朝向呢?
回答:
与手掌正面匹配的问题属于纹理分类,是一个经典的模式识别问题。我建议你尝试以下方法之一:
- 加博滤波器:它在检测朝向和像素强度方面表现良好(因为手掌正面具有不同的特征),OpenCV中有getGaborKernel函数,该函数的两个非常重要的参数是theta(朝向)和lambd(频率)。为了简化操作,你可以在已经检测到的掌部区域上应用这个过程(例如,裁剪拇指或掌心重心周围的矩形区域等)。然后,你可以将其与同一区域的小型图像数据库进行卷积,以获得匹配率,或者你可以使用SVM分类器,你需要通过构建SVM所需的训练矩阵来训练你的SVM(查看此问题),这篇论文
- 局部二值模式(LBP):这是一种重要的特征描述符,用于纹理匹配,你可以将其应用于整个手掌图像或裁剪的区域或图像的手指,在OpenCV中使用起来很容易,有很多关于此方法的教程和代码。我建议你阅读这篇论文,讨论了使用局部二值模式进行不变纹理分类。这里有一个好的教程
-
哈拉利克纹理:我读到过,当一组特征量化整个图像(全局特征描述符)时,它的工作表现完美。它没有在OpenCV中实现,但易于实现,查看这个有用的教程
-
训练模型:我已经建议使用SVM分类器,与某些描述符结合使用,可以完美工作。OpenCV有一个有趣的FaceRecognizer类用于人脸识别,将其用于手掌识别可能是一个有趣的想法(通过调整大小和旋转来获得手掌的唯一姿势),这个类有三种方法可以使用,其中一种是局部二值模式直方图,推荐用于纹理识别。为什么不尝试其他模型(Eigenfaces和Fisherfaces)呢?查看这个教程