用hough+细化的方法,识别速度快,但是在某些情况下容易造成误差,识别不是很稳定。如下图:
由于深度图的视差等原因,会有些点找不到,如上图握拳后掌心位置,如果还采用前一章的方法,细化结果会很糟糕(掌心处会产生若干干扰线段)造成识别不准确。
可以利用图像形态学中的开闭运算消除这种影响,但是当五指靠的非常近时会对手指间造成恶劣的影响(五指被靠在一起了)。
考虑其他方法:利用图像轮廓+图像中凸包和凸缺陷以及矩的概念进行识别。
opencv提供了轮廓图像的轮廓检测,通过返回最外层轮廓可以得到手的边缘。
利用轮廓然后可以得到凸包和凸缺陷,从而得到一系列凸顶点和凸缺陷(凹)顶点和凹的深度(其中包含指尖坐标)
如上图所示,一只手有很多凸缺陷,需要一定的策略判断哪些是手指缝那些是干扰,可利用
凹的深度和凸点和凹点的夹角([0,90))进行阈值判断,夹角利用三点的向量积求得。但是大拇指比较特殊(当张开很大时角度可能偏大)
这里可以利用矩的概念进行识别,
矩是沿X,y方向的积分,因此有一个轮廓矩的概念,
轮廓矩是沿轮廓边界像素的积分,
用来计算形状的重心,面积,主轴和其它的形状特征等,因此可以求得手掌重心,根据其与凸缺陷点的物理距离可以舍去其他干扰因素。最终可求得指尖坐标。
相对上章算法,轮廓算法识别速度略显慢,但是识别精度比较高,稳定性好。不影响实时识别。但是存在下面问题:当只有一个手指头伸出或者做“六”动作的时候,轮廓不存在凹点,也就无法识别指尖了,因此,需要结合:
对轮廓识别出来后,如果轮廓法识别出0个指尖,那么对轮廓内部进行填充(消除第一张图的影响),利用hough法进行识别。两者的结果即为最终结果。
上结果图:
手指识别做好后,可以基于它做许多的应用,我基于识别结果做了个小的实例,可以隔空查看图片和看视频,废话不说,上图。
看图
看电影
如果将其与一些软件结合,可以做出很好的前景。如将其与U3D,UDK等3维可视化软件结合,可以做出一些比较有意思的体感游戏。