目录
一、CamShift
1.1 原理
二、流程
三、代码
四、总结
MeanShift的结果有一个问题,检测窗口的大小是固定的,而目标是一个由近到远逐渐变小的过程,固定的窗口是不合适的。 所以需要根据目标的大小和角度来修正窗口的大小和角度。
传统目标跟踪——meanshift算法_平行世界里的我的博客-CSDN博客
CamShift(Continuously Adaptive Mean-Shift algorithm)是MeanShift算法的改进算法,可以解决这个问题。它可以随着跟踪目标大小的变化实时调整搜索窗口的大小,具有更好的跟踪效果。 Camshift 算法首先应用MeanShift。 一旦MeanShift收敛,它就会更新窗口的大小,同时计算出最佳拟合椭圆的方向,从而根据目标的位置和大小来更新搜索窗口。
camshift讲解
camshift利用目标的颜色直方图模型将图像转换为颜色概率分布图,初始化一个搜索窗的大小和位置,并根据上一帧得到的结果自适应调整搜索窗口的位置和大小,从而定位出当前图像中目标的中心位置。
将meanshift算法扩展到连续图像序列,就是camshift算法。它将视频的所有帧做meanshift运算,并将上一帧的结果,即搜索窗的大小和中心,作为下一帧meanshift算法搜索窗的初始值。如此迭代下去,就可以实现对目标的跟踪。
算法过程为:
(1).初始化搜索窗
(2).计算搜索窗的颜色概率分布(反向投影)
(3).运行meanshift算法,获得搜索窗新的大小和位置。
(4).在下一帧视频图像中用(3)中的值重新初始化搜索窗的大小和位置,再跳转到(2)继续进行。
import cv2 as cv
# 创建读取视频的对象
cap = cv.VideoCapture("E:\Python-Code/videodataset/enn.mp4")
# 获取第一帧位置,并指定目标位置
ret, frame = cap.read()
c, r, h, w = 530, 160, 300, 320
track_window = (c, r, h, w)
# 指定感兴趣区域
roi = frame[r:r + h, c:c + w]
# 计算直方图
# 转换色彩空间
hsv_roi = cv.cvtColor(roi, cv.COLOR_BGR2HSV)
# 计算直方图
roi_hist = cv.calcHist([hsv_roi], [0], None, [180], [0, 180])
# 归一化
cv.normalize(roi_hist, roi_hist, 0, 255, cv.NORM_MINMAX)
# 目标追踪
# 设置窗口搜索终止条件:最大迭代次数,窗口中心漂移最小值
term_crit = (cv.TermCriteria_EPS | cv.TERM_CRITERIA_COUNT, 10, 1)
while True:
ret, frame = cap.read()
if ret:
# 计算直方图的反向投影
hsv = cv.cvtColor(frame, cv.COLOR_BGR2HSV)
dst = cv.calcBackProject([hsv], [0], roi_hist, [0, 180], 1)
# 进行meanshift追踪
ret, track_window = cv.meanShift(dst, track_window, term_crit)
# 将追踪的位置绘制在视频上,并进行显示
x, y, w, h = track_window
img = cv.rectangle(frame, (x, y), (x + w, y + h), 255, 2)
cv.imshow("frame", img)
if cv.waitKey(20) & 0xFF == ord('q'):
break
else:
break
# 资源释放
cap.release()
cv.destroyAllWindows()
然后运行结果中的绿色矩形框就能够根据跟踪的对象而自适应改变框的大小了(注意:这个Camshift很容易就会检测出错)
camshift能有效解决目标变形和遮挡的问题,对系统资源要求不高,时间复杂度低,在简单背景下能够取得良好的跟踪效果。但当背景较为复杂,或者有许多与目标颜色相似像素干扰的情况下,会导致跟踪失败。因为它单纯的考虑颜色直方图,忽略了目标的空间分布特性,所以这种情况下需加入对跟踪目标的预测算法。