我正在寻找一种简单的方法来识别手是张开还是闭合。
我正在使用 C# 和EmguCV,但这在这种情况下并不重要。我只需要一个描述我需要做什么的“伪代码”。
该算法的输入图像是代表手的二进制图像(我已经实现了分割过程)。输出必须是布尔值(打开手为真,否则为假)。
这是一个输入示例:
我试图考虑一些关于凸包或白色区域的百分比,但我想这些方法对于这类问题来说不够健壮。
我正在寻找一种简单的方法来识别手是张开还是闭合。
我正在使用 C# 和EmguCV,但这在这种情况下并不重要。我只需要一个描述我需要做什么的“伪代码”。
该算法的输入图像是代表手的二进制图像(我已经实现了分割过程)。输出必须是布尔值(打开手为真,否则为假)。
这是一个输入示例:
我试图考虑一些关于凸包或白色区域的百分比,但我想这些方法对于这类问题来说不够健壮。
Convex Hull 应该做的很好,你可以计算出凸包中的黑色区域百分比,如果它大于某个阈值,那么手是张开的。否则你可以只计算白色区域的面积和周长,然后检查它们的比率,张开的手面积/周长应该小于闭合的手。
在机器学习术语中,您尝试做的是对输入图像大小的二进制输入矩阵(1 表示白色像素,0 表示黑色像素)分类到单个二进制输出(1 表示张开手,0 表示闭合手)。
如果您通过拍摄大量闭合和张开手的图像并手动标记它们来构建训练集(双关语不是故意的),那么您可以应用监督学习算法来创建分类器。
监督学习算法有很多选择。也许第一次尝试最好的方法是支持向量机:
http://en.wikipedia.org/wiki/Support_vector_machine
支持向量机的工作原理是计算输入图像与训练集中提供的示例之间的“距离”。如果输入图像平均“更接近”训练集中的张开手的例子而不是训练集中的闭合手的例子,它将把它分类为张开的手(反之亦然)。
还有许多其他的监督学习算法: