Camshift算法

OpenCV的人脸追踪算法Camshift(连续自适应的Meanshift算法)由以下四个步骤组成:

1、创建一个颜色直方图表示人脸特征;

2、对视频图像中每一帧的每一个像素进行计算“人脸存在的可能性”;

3、在每个视频帧中移动人脸矩形框的位置;

4、计算人脸的大小和角度。

下面是每一步骤的详细工作:

一、创建一个表示人脸的Camshift直方图,它是以颜色值的直方图(或柱状图)来进行跟踪。图1是由装有OpenCVCamshiftdemo程序运行得到的两个直方图实例。每一个颜色条的高度表明了在一幅图像中有多少个像素点属于色度值。色度在HSV(色度、饱和度、值)颜色模型中用于描述一个像素的颜色。

1 Camshift算法用于描述人脸的颜色直方图

顶部的直方图代表了一幅图像区域,蓝色的色调是最常见的,稍微薰衣草色调是下一个最常见的。底部直方图中最右边的值表示最常见的色度范围,这个色度经常但不总是红色。

二、计算人脸概率

  在初始跟踪时计算人脸概率的直方图只创建一次,在视频接下来的每一帧的处理中,该直方图被用于将人脸概率值分配给帧的每一个像素点。

“人脸概率”听起来非常复杂,计算也复杂,而实际上并非如此。现在我们给出它是如何工作的。图2表明直方图颜色条的叠加。很明显在该图像区域中叠加后最右边的颜色条大约占45%的像素。这意味着一个像素的随机选择落在最右边容器里的概率是45%,那是这一像素的“人脸概率”。同样的逻辑表明,下一个直方图容器所代表的人脸概率在20%左右,因为它大约占了总高度的20%

新的视频帧到达时,每一个像素点的色度值被检测,通过人脸直方图给该像素点人脸概率。这个过程OpenCV被称为直方图背景投影”目前在OpenCV有一个内置方法实现了它,那就是cvCalcBackProject()函数

    3表示在通过Camshift算法跟踪我的脸时计算一个视频帧图像中可能存在人脸的图像。黑色像素概率值最低,白色像素概率最高灰色的像素介于两者之间。

三、在每个视频帧中移动人脸矩形框的位置

    Camshift“改变”它的人脸位置判断,在可能存在人脸的图像中始终保持集中在高亮像素区域。它通过原先位置并计算一个矩形框中的人脸概率值来得出新位置,OpenCVcvCamShift函数的功能是增强这些步骤来转变到一个新的位置。

    这种和地球引力中心相一致的转换矩形的过程是基于Mean shift算法实现的,Mean shift算法由Comaniciu Dorin提出。事实上,Camshift算法就是“连续自适应的Mean shift算法”。

四、计算人脸大小和角度

Camshift算法被称为“持续自适应”,而不仅仅是“Mean shift(均值漂移)”,是因为它在每次计算人脸存在的矩形框的下一个位置时能够自动调整大小和角度。它选择的缩放值和初始方向是最符合face-probability的在新的矩形框位置的像素点。

 

文章来源:http://www.cnblogs.com/seacode/archive/2010/09/28/1837694.html

 

### 介绍 CAMShift算法,即“Continuously Adaptive Mean - Shift”算法,是一种运动跟踪算法,主要通过视频图像中运动物体的颜色信息来达到跟踪的目的。该算法可分解为获取概率密度图、找到概率密度图的最大密度位置以及迭代三个部分 [^1][^2]。 ### 原理 - **色彩投影图(反向投影)**:RGB颜色空间对光照亮度变化较为敏感,为减少此变化对跟踪效果的影响,先将图像从RGB空间转换到HSV空间。接着对其中的H分量作直方图,该直方图代表了不同H分量值出现的概率或者像素个数,可得到颜色概率查找表。最后将图像中每个像素的值用其颜色出现的概率替换,得到颜色概率分布图,此过程叫反向投影,颜色概率分布图是一个灰度图像 [^3]。 - **MeanShift**:是一种密度函数梯度估计的非参数方法,通过迭代寻优找到概率分布的极值来定位目标 [^3]。 - **CAMShift**:将MeanShift算法扩展到连续图像序列,对视频的所有帧做MeanShift运算,并将上一帧的结果(搜索窗的大小和中心)作为下一帧MeanShift算法搜索窗的初始值,如此迭代实现对目标的跟踪。算法过程为:初始化搜索窗;计算搜索窗的颜色概率分布(反向投影);运行MeanShift算法,获得搜索窗新的大小和位置;在下一帧视频图像中用前一步的值重新初始化搜索窗的大小和位置,再重复计算颜色概率分布等步骤 [^3][^4]。 ### 应用 CAMShift算法能有效解决目标变形和遮挡的问题,对系统资源要求不高,时间复杂度低,适用于简单背景下的目标跟踪,如视频监控中对特定运动物体的跟踪等。不过,当背景较为复杂,或者有许多与目标颜色相似像素干扰的情况下,会导致跟踪失败,此时需加入对跟踪目标的预测算法 [^3]。 ### 实现示例(Python + OpenCV) ```python import cv2 import numpy as np # 打开视频文件 cap = cv2.VideoCapture('your_video.mp4') # 读取第一帧 ret, frame = cap.read() # 选择跟踪区域 r, h, c, w = 250, 90, 400, 125 track_window = (c, r, w, h) # 提取跟踪区域 roi = frame[r:r + h, c:c + w] # 转换为HSV颜色空间 hsv_roi = cv2.cvtColor(roi, cv2.COLOR_BGR2HSV) # 创建掩码,去除低亮度和高饱和度的像素 mask = cv2.inRange(hsv_roi, np.array((0., 60., 32.)), np.array((180., 255., 255.))) # 计算直方图 roi_hist = cv2.calcHist([hsv_roi], [0], mask, [180], [0, 180]) # 归一化直方图 cv2.normalize(roi_hist, roi_hist, 0, 255, cv2.NORM_MINMAX) # 设置终止条件:迭代10次或移动小于1个像素 term_crit = (cv2.TERM_CRITERIA_EPS | cv2.TERM_CRITERIA_COUNT, 10, 1) while True: ret, frame = cap.read() if ret: # 转换为HSV颜色空间 hsv = cv2.cvtColor(frame, cv2.COLOR_BGR2HSV) # 计算反向投影 dst = cv2.calcBackProject([hsv], [0], roi_hist, [0, 180], 1) # 应用CAMShift算法 ret, track_window = cv2.CamShift(dst, track_window, term_crit) # 绘制跟踪窗口 pts = cv2.boxPoints(ret) pts = np.int0(pts) img2 = cv2.polylines(frame, [pts], True, 255, 2) cv2.imshow('CAMShift Tracking', img2) # 按 'q' 键退出 if cv2.waitKey(30) & 0xFF == ord('q'): break else: break # 释放资源 cap.release() cv2.destroyAllWindows() ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值