import numpy as np
import cv2 as cv
# opencv实现meanshift的api
# cv.meanShift(probImage,window,criteria)
# 参数一:roi区域,目标直方图的反向投影
# 参数二:初始搜索窗口,就是定义roi的rect
# 参数三: 确定窗口搜索的停止准则,主要有迭代数达到最大值,窗口中心的漂移值大于某个设定的限值
# 实现Meanshift的主要流程是∶
# 1.读取视频文件:cv.videoCapture()
# 2.感兴趣区域设置:获取第一帧图像,q并设置目标区域,即感兴趣区域3.计算直方图:计算感兴趣区域的HSV直方图,并进行归一化
# 4.目标追踪∶设置窗口搜索停止条件,直方图反向投影,进行目标追踪,并在目标位置绘制矩形框。
# 1 获取视频
cap = cv.VideoCapture('./DOG.mp4')
# 2 指定追踪目标
ret,frame = cap.read()
r,h,c,w = 197,141,0,208
win = (c,r,w,h)
roi = frame[r:r+h,c:c+w]
# 3 计算直方图
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)
# 4 目标追踪 ,最大迭代10,漂移1
term = (cv.TERM_CRITERIA_EPS|cv.TERM_CRITERIA_COUNT,10,1)
while(True):
ret,frame = cap.read()
if ret==True:
hst=cv.cvtColor(frame,cv.COLOR_BGR2HSV)
dst=cv.calcBackProject([hst],[0],roi_hist,[0,180],1)
ret,win = cv.meanShift(dst,win,term)
x,y,w,h = win
img2 = cv.rectangle(frame,(x,y),(x+w,y+h),255,2)
cv.imshow("frame",img2)
if cv.waitKey(60)&0xFF == ord('q'):
break
# 5 释放资源
cap.release()
cv.destroyAllWindows()
camshift算法全称“continuously adaptive mean-shift”(连续自适应meanshift算法),是对meanshift算法的改进算法,可随着跟踪目标的大小变化实时调整搜索窗口的大小,具有较好的跟踪效果。
Camshift算法首先应用meanshift,一旦meanshift收敛,它就会更新窗口的大小,还计算最佳拟合椭圆的方向,从而根据目标的位置和大小更新搜索窗口。如下图所示:
Camshift在opencv中实现时,只需要将上述的meanshift改为camshaft函数即可
在绘制矩形框时有所不同,meanshift是直接画出矩形框,而camshift则是根据求出的点来进行绘制的。
将camshift中:
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)
?改为:
#进行camshift追踪
ret, track_window = cv.CamShift(dst, track_window, term_crit)
#绘制追踪结果
pst = cv.boxPoints(ret)
pts = np.int0(pts)
img2 = cv.ploylines(frame,[pts],True,255,2)
算法总结: Meanshift和camshift算法都各有优势,自然也有劣势:
- . Meanshift算法:简单,迭代次数少,但无法解决目标的遮挡问题并且不能适应运动目标的的形状和大小变化。
- . camshift算法∶可适应运动目标的大小形状的改变,具有较好的跟踪效果,但当背景色和目标颜色接近时,容易使目标的区域变大,最终有可能导致目标跟踪丢失。
?总结
1.meanshift ????????原理:一个迭代的步骤,即先算出当前点的偏移均值,移动该点到其偏移均值,然后以此为新的起始点,继续移动,直到满足一定的条件结束。 APl: cv.meanshift() ????????优缺点∶简单,迭代次数少,但无法解决目标的遮挡问题并且不能适应运动目标的的形状和大小变化 2.camshift ????????原理:对meanshift算法的改进,首先应用meanshift,一旦meanshift收敛,它就会更新窗口的大小,还计算最佳拟合椭圆的方向,从而根据目标的位置和大小更新搜索窗口。 APl: cv.camshift() 优缺点∶可适应运动目标的大小形状的改变,具有较好的跟踪效果,但当背景色和目标颜色接近时,容易使目标的区域变大,最终有可能导致目标跟踪丢失
|