文章目錄
- 前言
- 一、OpenCV 中的物體跟蹤算法
- 1、均值漂移(Mean Shift):
- 2、CamShift:
- 3、KCF(Kernelized Correlation Filters):
- 4、MIL(Multiple Instance Learning):
- 二、物體跟蹤方法
- 1、基于特征的跟蹤方法
- (1)光流法:
- (2)特征點跟蹤法:
- 2、基于模型的跟蹤方法
- 3、基于外觀模型的跟蹤方法
- 4、基于深度學習的跟蹤方法
- 5、基于檢測的跟蹤方法
- 物體跟蹤的一般步驟
- 三、常見的物體跟蹤器介紹
- 四、調用攝像頭物體跟蹤
- 1、分步講解
- (1)導庫并創建
- (2)讀取攝像頭對象或者讀取視頻
- (3)循環讀取視頻的每一幀
- (4)當按下鍵盤中的S鍵時,開始追蹤
- cv2.selectROI() 函數
- tracker.init(frame, roi)
- (5)當Tracking為True時條件滿足,更新位置,繪制被追蹤物體的外接矩形
- (6)這里表示攝像頭顯示每一毫秒讀取一幀畫面,當按下ESC鍵時跳出循環,停止讀取,并釋放攝像頭資源,摧毀窗口,減少內存的占用。
- 完整代碼
- 五、應用
- 視頻監控領域
- 智能交通領域
- 體育領域
- 虛擬現實和增強現實領域
- 醫學領域
前言
物體跟蹤是在視頻序列或圖像流中持續監測和定位特定物體的過程。通過分析相鄰幀之間物體的特征和位置變化,實現對物體運動的跟蹤。
一、OpenCV 中的物體跟蹤算法
1、均值漂移(Mean Shift):
基于概率分布的跟蹤算法。它通過計算目標區域的顏色直方圖,在后續幀中搜索與該直方圖最匹配的區域,從而實現目標跟蹤。該算法計算速度快,但對目標的尺度變化和旋轉不魯棒。
2、CamShift:
是均值漂移算法的擴展。它不僅能跟蹤目標的位置,還能根據目標的大小和形狀自適應地調整搜索窗口的大小和方向,對目標的尺度變化有一定的適應性。
3、KCF(Kernelized Correlation Filters):
基于相關濾波的跟蹤算法。它利用核函數將目標特征映射到高維空間,通過學習目標的外觀模型,在后續幀中快速定位目標。KCF 算法具有較高的跟蹤精度和速度,對光照變化和部分遮擋有較好的魯棒性。
4、MIL(Multiple Instance Learning):
采用多示例學習的方法來訓練目標模型。它將目標區域劃分為多個子區域,通過學習這些子區域的特征來跟蹤目標。MIL 算法對遮擋和背景干擾具有較好的魯棒性,但計算復雜度較高,跟蹤速度相對較慢。
二、物體跟蹤方法
1、基于特征的跟蹤方法
(1)光流法:
光流是指圖像中物體表面上的點在圖像平面上的運動速度。通過計算相鄰幀之間像素點的光流場,可以得到物體的運動信息,進而實現物體跟蹤。該方法對物體的運動較為敏感,但對光照變化和噪聲的魯棒性相對較差。
(2)特征點跟蹤法:
首先在圖像中提取一些具有獨特性和穩定性的特征點,如 SIFT、SURF、ORB 等特征點。然后在后續幀中通過匹配這些特征點來跟蹤物體的運動。這種方法對物體的旋轉、尺度變化和光照變化有一定的適應性,但當特征點被遮擋或丟失時,可能會影響跟蹤效果。
2、基于模型的跟蹤方法
模板匹配法:在第一幀中手動或自動選擇一個目標模板,然后在后續幀中通過搜索與模板最相似的區域來定位目標。常用的相似性度量方法有歸一化互相關(NCC)等。該方法簡單直觀,但對目標的尺度變化、旋轉和光照變化的適應性較差,且計算量較大。
3、基于外觀模型的跟蹤方法
通過學習目標物體的外觀模型來進行跟蹤。例如,使用主成分分析(PCA)等方法對目標的圖像特征進行降維,建立目標的外觀模型。在跟蹤過程中,根據當前幀的圖像特征與外觀模型的匹配程度來確定目標的位置。這種方法對目標的外觀變化有一定的適應性,但需要大量的訓練數據來建立準確的外觀模型。
4、基于深度學習的跟蹤方法
孿生網絡:孿生網絡是一種基于深度學習的物體跟蹤方法,它通過孿生結構的神經網絡學習目標與搜索區域之間的相似性度量。在訓練過程中,孿生網絡通過大量的圖像對來學習如何區分目標物體和背景,從而能夠在新的視頻序列中快速準確地定位目標。孿生網絡具有較高的跟蹤精度和速度,對各種復雜場景和目標變化具有較好的魯棒性。
5、基于檢測的跟蹤方法
利用深度學習目標檢測算法,如 Faster R-CNN、YOLO 等,在每一幀中對目標進行檢測,然后通過數據關聯算法將不同幀中的檢測結果進行關聯,實現物體跟蹤。這種方法能夠利用深度學習強大的特征提取能力,對目標的檢測和跟蹤效果較好,但計算量較大,實時性相對較差。
物體跟蹤的一般步驟
目標初始化:在第一幀圖像中指定要跟蹤的目標物體,可以通過手動選擇目標區域或使用目標檢測算法來確定目標的初始位置和大小。
特征提取:根據選擇的跟蹤算法,提取目標物體的特征,如顏色、紋理、形狀等。這些特征將用于在后續幀中識別和定位目標。
跟蹤過程:在后續的視頻幀中,根據上一幀的跟蹤結果,利用選定的跟蹤算法在當前幀中搜索目標物體的新位置。算法會根據目標的特征和運動模型,預測目標可能出現的位置,并在該區域內進行匹配和定位。
結果更新:將當前幀中目標的位置和狀態信息更新到跟蹤器中,以便為下一幀的跟蹤提供初始條件。同時,根據需要可以對目標的特征模型進行在線學習和更新,以適應目標外觀的變化。
三、常見的物體跟蹤器介紹
1、BOOSTING 跟蹤器
原理:基于 AdaBoost 算法,通過迭代訓練多個弱分類器并組合成強分類器。在跟蹤過程中,不斷利用樣本更新分類器,以區分目標和背景。
特點:
精度較低,在目標外觀變化、光照變化或存在遮擋時,容易丟失目標。
計算速度較慢,實時性較差。
對目標外觀變化的適應性較弱。
適用場景:適用于目標外觀相對穩定、光照變化小且對精度要求不高的簡單場景。
import cv2boosting_tracker = cv2.legacy.TrackerBoosting_create()
2、MIL(Multiple Instance Learning)跟蹤器
原理:采用多示例學習方法,將目標區域劃分為多個子區域(示例),通過學習這些子區域的特征來訓練目標模型。在跟蹤時,根據模型匹配目標位置。
特點:
對部分遮擋有一定的魯棒性,能夠在目標被部分遮擋時繼續跟蹤。
跟蹤精度一般,當目標快速運動或外觀變化劇烈時,跟蹤效果不佳。
計算復雜度較高,速度較慢。
適用場景:適用于目標可能會被部分遮擋,但運動速度相對較慢、外觀變化不太劇烈的場景。
import cv2mil_tracker = cv2.legacy.TrackerMIL_create()
3、 KCF(Kernelized Correlation Filters)跟蹤器
原理:基于相關濾波的方法,通過核函數將目標特征映射到高維空間,學習目標的外觀模型,在后續幀中利用相關濾波快速定位目標。
特點:
跟蹤速度快,具有較好的實時性。
對目標的尺度變化和部分遮擋有一定的適應性。
精度相對較高,但在目標外觀發生較大變化時,跟蹤效果會受到影響。
適用場景:適用于對實時性要求較高,目標外觀變化不大、運動速度適中的場景。
import cv2kcf_tracker = cv2.TrackerKCF_create()
4、CSRT(Discriminative Correlation Filter with Channel and Spatial Reliability)跟蹤器
原理:同樣基于相關濾波,通過引入通道和空間可靠性信息,提高目標跟蹤的精度和魯棒性。
特點:
跟蹤精度高,在目標外觀變化、尺度變化和遮擋等情況下,都能保持較好的跟蹤效果。
計算速度相對較慢,實時性不如 KCF 跟蹤器。
適用場景:適用于對跟蹤精度要求較高,目標外觀和尺度可能會發生變化,且存在一定遮擋的復雜場景。
import cv2csrt_tracker = cv2.legacy.TrackerCSRT_create()
5、MEDIANFLOW 跟蹤器
原理:基于光流法,通過計算目標區域內像素點的光流,預測目標在后續幀中的位置。使用中值流的方法來提高跟蹤的穩定性。
特點:
跟蹤速度快,能夠實時處理視頻流。
對目標的運動速度和方向變化較為敏感,在目標運動平穩時,跟蹤效果較好。
對遮擋和外觀變化的魯棒性較差,容易丟失目標。
適用場景:適用于目標運動平穩、無明顯遮擋和外觀變化的場景,如監控視頻中的靜態場景跟蹤。
import cv2medianflow_tracker = cv2.legacy.TrackerMedianFlow_create()
6、TLD(Tracking - Learning - Detection)跟蹤器
原理:結合了跟蹤(Tracking)、學習(Learning)和檢測(Detection)三個模塊。跟蹤模塊負責在當前幀中預測目標的位置;學習模塊不斷更新目標的外觀模型;檢測模塊用于在整個圖像中搜索目標,以應對目標丟失或遮擋的情況。
特點:
對目標的長期跟蹤效果較好,能夠在目標長時間消失后重新檢測到目標。
容易產生漂移問題,即跟蹤結果逐漸偏離真實目標。
計算量較大,實時性較差。
適用場景:適用于需要對目標進行長時間跟蹤,且目標可能會暫時消失或被遮擋的場景。
import cv2tld_tracker = cv2.legacy.TrackerTLD_create()
四、調用攝像頭物體跟蹤
1、分步講解
(1)導庫并創建
import cv2tracker=cv2.TrackerCSRT_create() #創建CRST跟蹤器
tracking=False #tracking 一般用來表示是否處于跟蹤狀態。False 意味著當前并未開始跟蹤目標。
(2)讀取攝像頭對象或者讀取視頻
cap=cv2.VideoCapture(0)
寫零表示調用電腦自身的攝像頭,里面還可以傳視頻文件(傳入參數為視頻的保存路徑)
(3)循環讀取視頻的每一幀
while True:ret,frame=cap.read() #使用read讀取,視頻或攝像頭中的每一幀,ret表示視頻是否讀取成功,frame是指每一幀圖像畫面。if not ret: #表示視頻讀取失敗,則跳出循環break
(4)當按下鍵盤中的S鍵時,開始追蹤
if cv2.waitKey(1)==ord('s'):tracking=Trueroi=cv2.selectROI('Tracking',frame,showCrosshair=False)tracker.init(frame,roi)
cv2.selectROI() 函數
其作用是讓用戶手動選取視頻幀里的一個感興趣區域(Region of Interest,簡稱 ROI)。
1、 ‘Tracking’:這是彈出的選擇窗口的標題,當運行代碼時,會出現一個名為 Tracking 的窗口,用戶可以在這個窗口里進行 ROI 的選擇操作。
2、frame:這是當前要處理的視頻幀,也就是用戶選擇 ROI 所基于的圖像。
3、showCrosshair=False:這個參數控制在選擇 ROI 時是否顯示十字線。設置為 False 表示不顯示十字線;若設置為 True,在選擇 ROI 的過程中會顯示十字線,方便用戶更精準地定位 ROI 的中心位置。
4、cv2.selectROI() 函數在用戶完成 ROI 選擇后,會返回一個包含 ROI 位置和大小信息的元組 (x, y, w, h),其中:
x 和 y 是 ROI 左上角的坐標。
w 和 h 分別是 ROI 的寬度和高度。
tracker.init(frame, roi)
調用了跟蹤器對象 tracker 的 init() 方法,其作用是使用用戶選擇的 ROI 來初始化跟蹤器。
1、frame:這是當前的視頻幀,也就是用戶選擇 ROI 所在的那一幀圖像。跟蹤器會以這一幀為基準,對后續視頻幀里的目標進行跟蹤。
2、roi:這是前面通過 cv2.selectROI() 函數得到的 ROI 信息,跟蹤器會根據這個 ROI 來確定要跟蹤的目標。
(5)當Tracking為True時條件滿足,更新位置,繪制被追蹤物體的外接矩形
if tracking:success,box=tracker.update(frame)if success: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('Tracking',frame)
success, box = tracker.update(frame)
調用了跟蹤器對象 tracker 的 update() 方法,用于在當前視頻幀 frame 中更新目標的位置。
返回值:
1、success:一個布爾值,用于表示目標跟蹤是否成功。如果成功跟蹤到目標,success 為 True;否則為 False。
2、 box:一個包含目標位置和大小信息的元組,通常格式為 (x, y, w, h),其中 x 和 y 是目標矩形框左上角的坐標,w 和 h 分別是矩形框的寬度和高度。
(6)這里表示攝像頭顯示每一毫秒讀取一幀畫面,當按下ESC鍵時跳出循環,停止讀取,并釋放攝像頭資源,摧毀窗口,減少內存的占用。
if cv2.waitKey(1)==27:break
cap.release()
cv2.destroyAllWindows()
完整代碼
import cv2tracker=cv2.TrackerCSRT_create()
tracking=Falsecap=cv2.VideoCapture(0) #寫零表示調用電腦自身的攝像頭,里面還可以傳視頻文件(傳入參數為視頻的保存路徑)
while True:ret,frame=cap.read()if not ret:breakif cv2.waitKey(1)==ord('s'):tracking=Trueroi=cv2.selectROI('Tracking',frame,showCrosshair=False)tracker.init(frame,roi)if tracking:success,box=tracker.update(frame)if success: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('Tracking',frame)if cv2.waitKey(1)==27:break
cap.release()
cv2.destroyAllWindows()
五、應用
物體跟蹤在多個領域都有廣泛的應用
視頻監控領域
行為分析:通過對監控視頻中人物或物體的跟蹤,分析其行為模式,如是否有異常徘徊、奔跑等行為,可用于公共場所的安全監控,及時發現潛在的安全威脅。
事件檢測:檢測特定事件的發生,如檢測商場中的顧客摔倒、打架等行為,以便及時采取相應措施。
智能交通領域
車輛跟蹤與流量監測:在交通路口或高速公路上,對車輛進行跟蹤,獲取車輛的行駛速度、軌跡等信息,從而實現交通流量的統計和分析,為交通管理部門提供決策依據,優化交通信號燈時長和道路規劃。
輔助自動駕駛:在自動駕駛車輛中,物體跟蹤技術可以實時跟蹤周圍的車輛、行人、交通標志等物體,為車輛的決策和控制提供重要信息,幫助車輛避免碰撞、規劃行駛路徑等。
體育領域
運動員表現分析:在體育比賽中,通過跟蹤運動員的運動軌跡和動作,可以對運動員的表現進行分析,幫助教練和運動員了解技術動作的優缺點,制定訓練計劃,提高運動成績。
比賽轉播:在體育賽事轉播中,物體跟蹤技術可以實時跟蹤運動員和球的位置,為觀眾提供更豐富的比賽信息,如球員的跑動距離、速度、傳球路線等,增強比賽的觀賞性和專業性。
虛擬現實和增強現實領域
交互體驗:在虛擬現實和增強現實應用中,通過跟蹤用戶的頭部、手部等身體部位的運動,實現與虛擬環境的自然交互。例如,用戶可以通過頭部轉動來觀察虛擬場景,通過手部動作來操作虛擬物體。
場景重建:物體跟蹤技術可以幫助重建真實場景的三維模型,將虛擬元素與真實場景更好地融合,提高增強現實應用的沉浸感。
醫學領域
手術導航:在手術過程中,通過跟蹤手術器械和患者體內的器官、組織等,為醫生提供實時的位置信息,輔助醫生進行精確的手術操作,提高手術的安全性和準確性。
康復治療:在康復治療中,跟蹤患者的肢體運動,評估康復訓練的效果,為康復治療方案的調整提供依據。