1.使用meanshift进行视频追踪:框口大小不变
API:
cv.meanShift(probImage, window, criteria)
参数:
-
probImage: ROI区域,即目标的直方图的反向投影 -
window: 初始搜索窗口,就是定义ROI的rect -
criteria: 确定窗口搜索停止的准则,主要有迭代次数达到设置的最大值,窗口中心的漂移值大于某个设定的限值等。
2.使用Camshift进行视频追踪:可根据目标的大小和角度来对窗口的大小和角度进行修正。
API:
cv.CamShift(probImage, window, criteria)
实例探讨:
#库导入
import cv2 as cv
import numpy as np
from matplotlib import pyplot as plt
#获取视频对象
video = cv.VideoCapture('test_video.mp4')
#meanShift进行视频追踪
#获取第一帧图片信息
ret,frame = video.read()
#设置目标位置(行,高,列,宽)
r,h,c,w = 500,50,140,123
track_window = (c,r,w,h)
#指定目标的感兴趣区域
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.TERM_CRITERIA_EPS|cv.TERM_CRITERIA_COUNT,10,1)
while(True):
ret,frame=video.read()
if ret == True:
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
img2=cv.rectangle(frame,(x,y),(x+w,y+h),255,2)
cv.imshow('frame',frame)
if cv.waitKey(60)&0xFF == ord('q'):
break
else:
break
video.release()
cv.destroyAllWindows()
#CamShift进行视频追踪
while(True):
ret,frame=video.read()
if ret == True:
hsv = cv.cvtColor(frame,cv.COLOR_BGR2HSV)
dst = cv.calcBackProject([hsv],[0],roi_hist,[0,180],1)
#进行camshift追踪
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',frame)
if cv.waitKey(60)&0xFF == ord('q'):
break
else:
break
#其余操作类似
|