作者:蛋壳 | 来源:互联网 | 2023-09-23 13:15
英文地址:http:www.cnblogs.comseacodearchive201009281837694.htmlOpenCV的人脸追踪算法Camshift
英文地址:http://www.cnblogs.com/seacode/archive/2010/09/28/1837694.html
OpenCV的人脸追踪算法Camshift(连续自适应的Meanshift算法)由以下四个步骤组成:
1、创建一个颜色直方图表示人脸特征;
2、对视频图像中每一帧的每一个像素进行计算“人脸存在的可能性”;
3、在每个视频帧中移动人脸矩形框的位置;
4、计算人脸的大小和角度。
下面是每一步骤的详细工作:
一、创建一个表示人脸的Camshift直方图,它是以颜色值的直方图(或柱状图)来进行跟踪。图1是由装有OpenCV的Camshift的demo程序运行得到的两个直方图实例。每一个颜色条的高度表明了在一幅图像中有多少个像素点属于色度值。色度在HSV(色度、饱和度、值)颜色模型中用于描述一个像素的颜色。
图1 Camshift算法用于描述人脸的颜色直方图
顶部的直方图代表了一幅图像区域,蓝色的色调是最常见的,稍微薰衣草色调是下一个最常见的。底部直方图中最右边的值表示最常见的色度范围,这个色度经常但不总是红色。
二、计算人脸概率
在初始跟踪时计算人脸概率的直方图只创建一次,在视频接下来的每一帧的处理中,该直方图被用于将人脸概率值分配给帧的每一个像素点。
“人脸概率”听起来非常复杂,计算也复杂,而实际上并非如此。现在我们给出它是如何工作的。图2表明直方图颜色条的叠加。很明显在该图像区域中叠加后最右边的颜色条大约占45%的像素。这意味着一个像素的随机选择落在最右边容器里的概率是45%,那是这一像素的“人脸概率”。同样的逻辑表明,下一个直方图容器所代表的人脸概率在20%左右,因为它大约占了总高度的20%。
当新的视频帧到达时,每一个像素点的色度值被检测,通过人脸直方图给该像素点赋人脸概率值。这个过程在OpenCV中被称为“直方图背景投影”。目前在OpenCV中有一个内置方法实现了它,那就是cvCalcBackProject()函数。
图3表示在通过Camshift算法跟踪我的脸时计算一个视频帧图像中可能存在人脸的图像。黑色像素概率值最低,白色像素概率最高,灰色的像素介于两者之间。
三、在每个视频帧中移动人脸矩形框的位置
Camshift“改变”它的人脸位置判断,在可能存在人脸的图像中始终保持集中在高亮像素区域。它通过原先位置并计算一个矩形框中的人脸概率值来得出新位置,OpenCV中cvCamShift函数的功能是增强这些步骤来转变到一个新的位置。
这种和地球引力中心相一致的转换矩形的过程是基于Mean shift算法实现的,Mean shift算法由Comaniciu Dorin提出。事实上,Camshift算法就是“连续自适应的Mean shift算法”。
四、计算人脸大小和角度
Camshift算法被称为“持续自适应”,而不仅仅是“Mean shift(均值漂移)”,是因为它在每次计算人脸存在的矩形框的下一个位置时能够自动调整大小和角度。它选择的缩放值和初始方向是最符合face-probability的在新的矩形框位置的像素点。