1. tracker = cv2.multiTracker_create() 得到追蹤的初始化結果html
2.cv2.TrackerKCF_create() 得到KCF追蹤器算法
3.cv2.resize(frame, (w, h), cv2.INTER_AEAR) # 進行圖像大小的從新變化
參數說明:frame表示輸入圖片,(w, h) 表示變化後的長和寬, cv2.INTER_AEAR表示插值的方法app
4.cv2.selectROI(‘Frame’, frame, fromCenter=False,showCrosshair) 在圖像上進行選框操做
參數說明:‘Frame'表示圖片的名字,frame表示讀取的圖片,fromCenter表示選框的起點是否在中心位置,showCrosshair表示是否展現選框ssh
KCF是一種鑑別式追蹤方法,這類方法通常在追蹤過程當中訓練一個目標檢測器,使用目標檢測器與預測下一個階段預測位置是不是目標,而後使用新檢測結果去跟新訓練集而跟新目標檢測其ide
KCF貢獻spa
1.使用脊迴歸訓練目標檢測器,成功利用循環矩陣在傅里葉空間對角化的性質,將矩陣的運算轉換爲向量的Hadamad積,即元素的點乘,大大下降了運算量,提升了運算速度code
1.脊迴歸,在原有的基礎上引入了λ|w^2| 爲了防止過擬合的出現,即w的分佈更小且更加均勻(0, 0, 0, 1) 和 (0.25, 0.25, 0.25, 0.25), 對w進行求導,導數爲0,解得w視頻
2.循環矩陣,即訓練圖像都是經過目標樣本的循環位移獲得的, 經過PxQ進行x軸和y軸的平移變化htm
3.傅氏空間矩陣對角化, 即對上述的循環空間作一個傅里葉變化blog
4. 將循環矩陣x帶入到脊迴歸進行求解
最後作的一個總結部分
參考連接:https://www.cnblogs.com/YiXiaoZhou/p/5925019.html
代碼:
第一步: 進行 argparse參數設置
第二步:使用字典構造已有的追蹤目標的方法
第三步:使用cv2.multiTracker_create() 構造出追蹤器集合trackers
第四步:使用cv2.capture進行視頻的讀入
第五步:while True循環,使用cv2.read() 讀入圖片
第六步:使用cv2.resize進行圖片的放縮變換
第七步:trackers.apply(frame)對圖片運用追蹤算法
第八步:循環boxes對圖像進行畫圖操做
第九步:展現圖片,
第十步:並判斷按鍵,若是按s,進行box的添加,若是按ESC鍵就退出
第十一步:若是按s,使用box = cv2.selectROI()進行區域的選擇,並使用trackers.add將追蹤器和圖片,以及區域進行添加
import argparse import cv2 import time # 第一步進行參數設置 ap = argparse.ArgumentParser() ap.add_argument('-v', '--video', type=str, default='videos/soccer_01.mp4', help='path to input video file') ap.add_argument('-t', '--tracker', type=str, default='kcf', help='Opencv object tracker type') args = vars(ap.parse_args()) # opencv已經實現的追蹤算法 # 第二步:構造cv2已有追蹤算法的列表 OPENCV_OBJECT_TRACKERS = { "csrt": cv2.TrackerCSRT_create, "kcf": cv2.TrackerKCF_create, "boosting": cv2.TrackerBoosting_create, "mil": cv2.TrackerMIL_create, "tld": cv2.TrackerTLD_create, "medianflow": cv2.TrackerMedianFlow_create, "mosse": cv2.TrackerMOSSE_create } # 第三步:實例化追蹤器 # 實例化Opencv's multi-object tracker trackers = cv2.MultiTracker_create() # 第四步:使用cv2.VideoCapture讀取視頻 vs = cv2.VideoCapture(args['video']) while True: # 第五步:讀入第一張圖片 frame = vs.read() frame = frame[1] # 到頭了就結束 if frame is None: break # 第六步:使用cv2.resize對圖像進行長寬的放縮操做 h, w = frame.shape[:2] width = 600 r = width / float(w) dim = (width, int(r * h)) frame = cv2.resize(frame, dim, cv2.INTER_AREA) # 第七步:使用trackers.apply得到矩形框 (success, boxes) = trackers.update(frame) # 第八步:循環多組矩形框,進行畫圖操做 for box in boxes: (x, y, w, h) = [int(v) for v in box] cv2.rectangle(frame, (x, y), (x+w, y+h), (0, 255, 0), 2) # 第九步:進行圖像展現 cv2.imshow('Frame', frame) # 第十步:判斷按鍵,若是是s的話,進行畫出新的box key = cv2.waitKey(100) & 0xff if key == ord('s'): # 第十一步:選擇一個區域,按s鍵,並將tracker追蹤器,frame和box傳入到trackers中 box = cv2.selectROI('Frame', frame, fromCenter=False, showCrosshair=True) tracker = OPENCV_OBJECT_TRACKERS[args['tracker']]() trackers.add(tracker, frame, box) elif key == 27: break vs.release() cv2.destroyAllWindows()
區域選擇 追蹤效果