📅  最后修改于: 2023-12-03 15:22:15.127000             🧑  作者: Mango
本文将介绍如何使用OpenCV 的 Camshift 算法来跟踪对象。Camshift 算法是一种基于颜色直方图的目标跟踪算法,能够对追踪目标进行自适应的颜色模型更新和目标大小的自适应变化。
import cv2
def track_object():
cap = cv2.VideoCapture(0)
# 读取视频数据源,如果要读取视频文件可以使用 cv2.VideoCapture("文件名")
while True:
ret, frame = cap.read()
# 逐帧读取视频数据
# 转换为 HSV 颜色空间
hsv = cv2.cvtColor(frame, cv2.COLOR_BGR2HSV)
# 创建一个矩形框,选择目标区域
track_window = cv2.selectROI("Tracking", frame, False)
# 注意:selectROI 应该在原始图像上执行,而不是前面转换为 HSV 的图像
# 提取目标区域的颜色直方图
roi = hsv[int(track_window[1]):int(track_window[1]+track_window[3]),
int(track_window[0]):int(track_window[0]+track_window[2])]
roi_hist = cv2.calcHist([roi], [0], None, [180], [0, 180])
# 归一化直方图,便于后面进行 CamShift 算法处理
cv2.normalize(roi_hist, roi_hist, 0, 255, cv2.NORM_MINMAX)
# 设置终止条件
term_crit = (cv2.TERM_CRITERIA_EPS | cv2.TERM_CRITERIA_COUNT, 10, 1)
while True:
ret, frame = cap.read()
if ret == True:
hsv = cv2.cvtColor(frame, cv2.COLOR_BGR2HSV)
# 反向投影(Back Projection),构建概率模型
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)
img = cv2.polylines(frame, [pts], True, (0, 255, 0), 2)
# 显示追踪结果
cv2.imshow("Tracking", img)
# 按 ESC 键退出
k = cv2.waitKey(1) & 0xff
if k == 27:
break
else:
break
cv2.destroyAllWindows()
cap.release()
if __name__ == '__main__':
track_object()
cv2.VideoCapture()
函数读取指定视频源,如果 cap.isOpened()
为 False,说明读取视频出现错误。cv2.selectROI()
函数,使用鼠标选择追踪目标区域,返回目标位置矩形框。cv2.calcHist()
计算。cv2.normalize()
函数。cv2.CamShift()
函数返回,计算目标矩形框顶点坐标,使用 cv2.polylines()
函数绘制矩形框。ESC
键退出,释放视频数据源。