目录
1.凸包
2.肤色模型
3.设计过程
1.基于YCrCb颜色空间的肤色检测算法及实现
2.手势轮廓提取
3.基于凸包的中值指尖检测
4.设计步骤
介绍凸包之前,首先介绍凸多边形,如图。如果一个多边形的任意一边所在的直线,能够使该多边形的其他各边都在直线的一侧,那我们就认为这个图形是凸多边形。凸多边形的所有内角和都小于180°,任意两个顶点的连线段都处于多边形的内部或边界上,与凸多边形对应的是凹多边形。
在给定的二维平面上存在一个有限点的集合,能够完全的包围这个集合的凸多边形有无数个,凸包就是其中面积最小的一个。图2-3表示的凸包的示意图,图中的黑色圆点代表有限的木桩集合,外围的曲线代表将木桩围起来的绳子,当绳子包围圈最小时就是这个集合的凸包。
为了将图中的像素点标记为肤色和非肤色两类,需要选用一种决策方法来进行肤色检测。肤色模型是在特定的颜色空间中用来描述肤色的分布的规律的数学模型,采用函数或查表等方式表明像素颜色和肤色的相似性,并由此判断像素是否为肤色。本文所采用的模型是肤色阈值模型
肤色阈值模型是一种划定肤色范围的简单肤色模型,该模型首先采用RGB空间表示的彩色图像变换到一个亮度影响较小的颜色空间,然后通过统计大量肤色样本中的肤色像素点的分布情况,得到一个或多个肤色范围并由此设定肤色阈值,最后遍历待检测图像的像素点,当像素点处于阈值范围内的时候,将其标记为肤色点,其他像素则被标记为非肤色点,由此可以达到肤色分割的二值图像。在YCrCb空间中,当像素点的颜色在 范围内的像素认为是肤色点,范围外的像素为非像素点。
肤色阈值模型算法简单,实现容易,但灵活读不够,造成误差较大。
肤色阈值模型一般是根据很多肤色样本的统计分析,得到某个颜色空间中肤色的阈值范围,再根据阈值检测肤色区域。
首先,通过摄像头采集手势图像,将图像转换到YCrCb颜色空间,建立初始的肤色检测模型,通过查找文献可以确定模型的参数值。然后遍历图像的每一个像素点,若该像素点的Cb,Cr值处于式(3-1)的范围内,即认为式肤色点。反之,则认为不是肤色点。
然后对图像进行开运算,消除小物体,在纤细点出分离物体,平缓边界的同时不改变其面积。然后进行闭运算,填充物体内的细小空洞,连接邻近物体,平滑边界。然后对图像进行腐蚀,去掉物体的边缘点,然而所有的细小的物体都会被认为是边缘点,因此会被整个删去。之后进行膨胀操作,留下来的物体还会变回原来的大小,而被删除的小物体则永远的消失了。
Cb∈[77,127 ] Cr∈[133,173] (3-1)
在定位指尖之前,需要先根据手势的二值图提取手势的轮廓。轮廓的提取可以得到目标边缘点的位置信息,减少图像中不被关注的部分,降低计算量,并保留手势的重要特征。
本文采用八邻域捜索法来提取手势轮廓,该方法属于串行边缘检测方法,当确定某个像素点属于边缘轮廓后,利用该像素点就可以找到与之相邻的下一个像素点,最终像素点连接得到一条封闭的轮廓曲线。
对于图像中的任意一个像素点,均存在八邻域点,即与之相邻的八个点。如果P(x,y)被确定为手势的边界点,那么下一个边界点必然在这个点的八邻域点之中,图3-2表示了八邻域点的位置编码和坐标表示,左侧为位置编码,右侧为坐标表示。
在Matlab中,通过bwboundaries函数来计算输入的二值图像的轮廓,函数的返回值包括计算出的轮廓和标注矩阵。轮廓提取结果如图
不同手势轮廓的凸包和缺陷都不相同,采用凸包分析的方法来检测指尖是通过分析手势轮廓的全局特性来实现的,因此既不需要匹配模板,也不用计算轮廊的局部特性,而且不受手势大小、方向和位置的影响,计算稳定可靠。
得到手势的轮廓之后,轮廓由一个有限点集构成,根据凸包算法能够求得手势轮廓的凸包。观察手势的结构特征可以发现,指尖处于轮靡的突出位置上,即轮廓凸包的顶点,因此筛选凸包的顶点可以确定指尖位置。
从图中可以看出,手势轮廓四包上的顶点并不都是指尖点,因此需要结合其他信息去除非指尖点,通过凸包的凸缺陷特征可以达到这个目的。如图3-3所示,手势的凸缺陷是图中的区域A~H,手势周围的深色凸多边形是凸包,凸包与手势轮廊之间的部分就是凸包的缺陷。不同的手势轮廓、凸包和凸缺陷体现了手的不同状态,因此可用来提取特征来区分不同的手势。
在计算凸包与凸缺陷之前,首先必须通过检测确定手势轮廓是否为凸,如果是凸的,则计算轮廓的凸包。凸包采用序列表示,序列可控制排列方向和表示方式。得到手势的凸包序列之后,再结合手势的轮廓可以计算手势的凸缺陷。凸缺陷采用结构体来保存,结构体中包含四个参数,start和end分别是凸缺陷的起点和终点,depth_point是凸缺陷与相应的凸包边距离最远的点,定义为缺陷的深度点,depth是深度点与相应的凸包边的距离,定义为缺陷的深度。
由图可知,两根手指之间的区域正是凸缺陷,因此凸缺陷的起点与终点是指尖的候选点。但是该指尖候选点的范围仍然较大,需要结合凸缺陷的深度信息筛选出有效的候选点来作为指尖点。由于两手指之间的凸缺陷深度较大,根据这一特征,可以设定缺陷深度阈值,当缺陷深度大于该阈值时,则认为该凸缺陷的起点终点有效。
根据中值是五个手指中最长的那一根(一般来说),因此,中指点的凸缺陷深度也是最大的,因此,从检测到的指尖中选出深度信息最大的一个即为中指指尖。
完整代码见下列网址
https://download.csdn.net/download/rainbow424/12115788