接着上一篇《指尖检测(一)》讲,当用曲率的方式检测出候选指尖点后,我们需要踢出非指尖点,主要就是手指间的凹槽。从原理上分析,如果候选点集Pi(i=0,1,2....)按照一定方式排列,比如都按顺时针或者逆时针存储在一个数组中,那么向量(Pi-1,Pi)和(Pi,Pi+1)(说明,这里向量表示不是这样的,因为这上面编辑公式不太方便就用这种方式表示了,大家理解就行) 的叉乘正负性不同也就是方向不同,通过这样的方式可以检测出来那哪些是指尖。理论上是可行的,但是我在具体编程时发现不太好写,因为我所找到的点是通过Opencv的一个函数得到的,点放在CvSeq的对象中,我输出了所以点进行观察,但是发现那些点既不是顺时针也不是逆时针排列,搞不清楚怎么排的。 还有种方法也可以去掉凹槽,那就是先算出手部轮廓坐标中心(横坐标平均,纵坐标平均)或者算重心(用矩算),然后根据点之间距离差异滤掉干扰点,但是在设置阈值上有点麻烦,如果手部轮廓图大小发生变化,那么固定阈值就不起作用。我考虑过用自适应阈值的方式,那就是通过图像大小和手部轮廓大小的比例关系来设置阈值,但我还为做实验验证是否可行。
那么由于有这些问题所在,我最后采用凸包和曲率结合的办法,在用曲率确定了候选点后,再用凸包算法找到手部轮廓凸包,再将凸包顶点与候选点比较获得手指点。
凸包算法简介:
1.在所有点中选取y坐标最小的一点H,当作基点。如果存在多个点的