环境:Windows+VisualStudio2015+ C++ +OpenCV2.7.9
之前尝试写过基于HSV颜色空间的肤色识别程序,发现效果不甚理想,环境噪声比较大,而且光照变化时的检测效果不好。
正好看到了一篇论文《基于HSV与YCrCb颜色空间进行肤色检测的研究》。里面针对HSV和YCrCb空间的各个通道统计了一组不同光照条件下的肤色图像,得到了如下结果
可以看出HSV颜色空间中H、S、V的标准差相对于YCrCb空间的标准差要大。而在YCrCb空间中,Y的标准差要明显大于其他两者。标准差越大则表明其值在亮度变化时波动大,因此选择标准差小的颜色通道比较好。
因此本次我选择了Cr与Cb通道做肤色检测(YCrCb颜色空间中,Y代表的是亮度,Cr 与Cb代表的都是色度,与亮度关系小,符合前述实验中得到的结果)
思路如下:
1)将RGB模型转换为YCbCr模型
2)阈值分割:根据多次实验确定,正常黄种人的Cr分量大约在140~·175之间,Cb分量大约在100~120之间。
代码如下