AFORGE 图像处理手势识别

发布时间 : 星期三 文章AFORGE 图像处理手势识别更新完毕开始阅读

的想法我们的手手势识别算法非常简单,100%基于直方图和统计数据,但不是东西 模式识别,神经网络,等。这使得该算法很容易实现和理解。 该算法的核心思想是基于分析两种类型的对象吗? 柱状图? 水平和垂直直方图,可以 计算使用HorizontalIntensityStatistics和VerticalIntensityStatistics类: 我们将开始从利用手手势识别水平直方图因为它看起来更有用的第一步。 我们要做的第一件事就是找到地区的形象,所占据的手,和地区,占领的躯干。 让吗? 仔细看看水平直方图。 从柱状图可以看出,手中? 地区相对较小 值的直方图,但躯干面积所代表的峰值高值。 考虑到一些简单的相对比例 人类的吗? 的身体,我们可以这样说,人类的手吗? 厚度不能超过30%的人类? 身体高度(30%相当大的价值,但是 让吗? 年代把安全作为一个例子)。 应用简单的阈值水平柱状图,我们可以很容易的将手? 地区和躯干面积: / /得到水平像素分布统计信息 HorizontalIntensityStatistics =新HorizontalIntensityStatistics(bodyImageData); int[]hisValues = his.Gray.Values(int[])。 克隆();

/ /构建地图的手(0)和躯干(1)

双torsoLimit = torsoCoefficient * bodyHeight;

(int i = 0;我< bodyWidth;+ +) {

hisValues[我]=((双)hisValues[我]/ 255 > torsoLimit)? 1:0; }

从阈值水平柱状图我们可以很容易地计算手? 和身体躯干长度? 宽度? 右边的长度 空白区域的宽度在直方图从右侧,左手的长度是从左边空白区域的宽度 和身体? 宽度是空区之间的区域的宽度:

/ /得到手的长度 int口= 0;

在((hisValues[口]= = 0)& &(口< bodyWidth)) 口+ +;

int右手= bodyWidth - 1;

在((hisValues(右手)= = 0)& &(右手> 0)) 右手,;

右手= bodyWidth -(右手+ 1);

/ /得到躯干的宽度

int torsoWidth = bodyWidth -口-右手;

现在,当我们有手吗? 和躯干长度? 年代的宽度,我们可以决定是否提出的手。 对于每个手,算法是尝试 检测如果手不提高,提高了斜下来,直或斜了。 4所有可能的位置 下图展示了在上面列出的顺序:

检查是否手提高我们将再次使用一些关于身体比例的统计假设。 如果没有手 提高了吗? 年代宽度水平直方图躯干不会超过30% ? 例如,年代宽度。 否则它了。

/ /流程的左手

如果(((双)口/ torsoWidth)> = handsMinProportion) {

/ /手 }

其他的 {

/ /手不提高 }

到目前为止,我们能够识别一个手的位置吗? 当手不提高。 现在我们需要 完成算法识别准确时手的位置。 为此,我们? 我使用 的VerticalIntensityStatistics类,这是前面提到的。 但是现在的类 不应用于整个对象? 形象,但只有手吗? 图片:

/ /提取左手的形象

作物cropFilter =新的作物(新矩形(0,0,口,bodyHeight)); 位图leftHandImage = cropFilter。 应用(bodyImageData);

/ /得到左手的位置

姿态。 口= GetHandPosition(leftHandImage);

上图包含很好样品和使用上述柱状图很容易 识别手势。 但是,在某些情况下我们可能没有这样清晰的像上面这样的直方图, 但有些嘈杂的直方图,这可能是由于光照条件和阴影。 所以之前做任何 最终决定的举起手,让? 执行两个垂直的预处理步骤 直方图。 这两个额外的步骤非常简单,所以这里不提供他们的代码,但可以 检索从本文附带的源代码。

1)首先我们需要删除低值直方图,然后更低的10% 最大的柱状图? 例如,s值。 下图演示了一个手吗? 映像,其中包含 一些工件造成阴影。 这种类型的工件可以很容易被过滤低价值 直方图,是什么还演示了在下图(直方图已经过滤)。

2)另一种类型的问题,我们也需要关心的,是吗?双胞胎吗? 一方面,这是 实际上一个影子。 这也可以很容易地解决了走在直方图和删除 山峰,这不是最高峰。

在这一点上我们应该清楚垂直直方图,喜欢的吗? 以前见过,所以 现在我们几步从认识手的姿势。

让吗? 年代开始认识到直接先举起手。 如果我们看一看直接的形象 手,然后我们可以作一个假设的身体比例吗? 长度大得多 比它的宽度。 在连续的情况下提高手其直方图应该相当高,但薄 峰值。 那么,我们呢? 年代使用这些属性来检查,如果手连续提高:

如果(((双)handImage。 宽/(直方图。 马克斯-直方图。 分钟+ 1))> minStraightHandProportion) {

handPosition = HandPosition.RaisedStraigh; }

其他的 {

/ /处理diagonaly举起的手 }

(注意:敏和马克斯的属性柱状图类返回最小值和最大值 与非零概率值。 在上面的示例代码中使用这些值来计算的 宽度所占据的直方图区域的手。 看文档AForge.Math名称空间)。 现在我们需要做最后的检查以确定手提高斜对角 下来。 从柱状图我们可以看出,提高斜向上/

联系合同范文客服:xxxxx#qq.com(#替换为@)