目录
原理
做法
代码实现
结果展示
原理
做法
代码实现
import numpy as np
import cv2 as cv
# 读取视频
cap = cv.VideoCapture('video.mp4')
# 检查视频是否成功打开
if not cap.isOpened():
print("Error: Cannot open video file.")
exit()
# 获取第一帧图像,并指定目标位置
ret, frame = cap.read()
# 目标位置
x, y, w, h = 960,500, 100, 100
track_window = (x, y, w, h)
# 指定目标的感兴趣区域
roi = frame[y:y+h, x:x+w]
# 转换感兴趣区域的颜色空间(HSV)
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.TERM_CRITERIA_EPS | cv.TERM_CRITERIA_COUNT, 10, 1)
while True:
# 获取每一帧图像
ret, frame = cap.read()
if not ret:
break
# 转换当前帧的颜色空间(HSV)
hsv = cv.cvtColor(frame, cv.COLOR_BGR2HSV)
# 计算直方图的反向投影
dst = cv.calcBackProject([hsv], [0], roi_hist, [0, 180], 1)
# 使用meanshift追踪
ret, track_window = cv.CamShift(dst, track_window, term_crit)
# 绘制追踪结果
pts = cv.boxPoints(ret)
pts = np.int0(pts)
img2 = cv.polylines(frame, [pts],True,255,2)
cv.imshow('frame', img2)
if cv.waitKey(60) & 0xFF == ord('q'):
break
cap.release()
cv.destroyAllWindows()
结果展示
追踪结果1