目录
原理
做法
代码实现
结果展示
原理
做法
代码实现
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'):breakcap.release()
cv.destroyAllWindows()
结果展示
追踪结果1