OpenCv高階(十一)——物體跟蹤

文章目錄

  • 前言
  • 一、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()

五、應用

物體跟蹤在多個領域都有廣泛的應用

視頻監控領域

行為分析:通過對監控視頻中人物或物體的跟蹤,分析其行為模式,如是否有異常徘徊、奔跑等行為,可用于公共場所的安全監控,及時發現潛在的安全威脅。
事件檢測:檢測特定事件的發生,如檢測商場中的顧客摔倒、打架等行為,以便及時采取相應措施。

智能交通領域

車輛跟蹤與流量監測:在交通路口或高速公路上,對車輛進行跟蹤,獲取車輛的行駛速度、軌跡等信息,從而實現交通流量的統計和分析,為交通管理部門提供決策依據,優化交通信號燈時長和道路規劃。
輔助自動駕駛:在自動駕駛車輛中,物體跟蹤技術可以實時跟蹤周圍的車輛、行人、交通標志等物體,為車輛的決策和控制提供重要信息,幫助車輛避免碰撞、規劃行駛路徑等。

體育領域

運動員表現分析:在體育比賽中,通過跟蹤運動員的運動軌跡和動作,可以對運動員的表現進行分析,幫助教練和運動員了解技術動作的優缺點,制定訓練計劃,提高運動成績。
比賽轉播:在體育賽事轉播中,物體跟蹤技術可以實時跟蹤運動員和球的位置,為觀眾提供更豐富的比賽信息,如球員的跑動距離、速度、傳球路線等,增強比賽的觀賞性和專業性。

虛擬現實和增強現實領域

交互體驗:在虛擬現實和增強現實應用中,通過跟蹤用戶的頭部、手部等身體部位的運動,實現與虛擬環境的自然交互。例如,用戶可以通過頭部轉動來觀察虛擬場景,通過手部動作來操作虛擬物體。
場景重建:物體跟蹤技術可以幫助重建真實場景的三維模型,將虛擬元素與真實場景更好地融合,提高增強現實應用的沉浸感。

醫學領域

手術導航:在手術過程中,通過跟蹤手術器械和患者體內的器官、組織等,為醫生提供實時的位置信息,輔助醫生進行精確的手術操作,提高手術的安全性和準確性。
康復治療:在康復治療中,跟蹤患者的肢體運動,評估康復訓練的效果,為康復治療方案的調整提供依據。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/bicheng/78384.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/78384.shtml
英文地址,請注明出處:http://en.pswp.cn/bicheng/78384.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

聲音分離人聲和配樂base,vocals,drums -從頭設計數字生命第6課, demucs——仙盟創夢IDE

demucs -n htdemucs --two-stemsvocals 未來之窗.mp3 demucs -n htdemucs --shifts5 之.mp3demucs -n htdemucs --shifts5 -o wlzcoutspl 未來之窗.mp3 伴奏提取人聲分離技術具有多方面的重大意義,主要體現在以下幾個領域: 音樂創作與制作 創作便利…

使用若依二次開發商城系統-4:商品屬性

功能3:商品分類 功能2:商品品牌 功能1:搭建若依運行環境前言 商品屬性功能類似若依自帶的字典管理,分兩步,先設置屬性名,再設置對應的屬性值。 一.操作步驟 1)數據庫表product_property和pro…

操作指南:vLLM 部署開源大語言模型(LLM)

vLLM 是一個專為高效部署大語言模型(LLM)設計的開源推理框架,其核心優勢在于顯存優化、高吞吐量及云原生支持。 vLLM 部署開源大模型的詳細步驟及優化策略: 一、環境準備與安裝 安裝 vLLM 基礎安裝:通過 pip 直接安裝…

32.768kHz晶振詳解:作用、特性及與其他晶振的區別

一、32.768kHz晶振的核心作用 實時時鐘(RTC)驅動: 提供精確的1Hz時鐘信號,用于計時功能(如電子表、計算機CMOS時鐘)。 分頻公式: 1Hz 32.768kHz / 2^15(通過15級二分頻實現&#x…

第3講、大模型如何理解和表示單詞:詞嵌入向量原理詳解

1. 引言 大型語言模型(Large Language Models,簡稱LLM)如GPT-4、Claude和LLaMA等近年來取得了突破性進展,能夠生成流暢自然的文本、回答復雜問題、甚至編寫代碼。但這些模型究竟是如何理解人類語言的?它們如何表示和處…

【Java面試筆記:進階】19.Java并發包提供了哪些并發工具類?

Java 并發包(java.util.concurrent)提供了一系列強大的工具類,用于簡化多線程編程、提升并發性能并確保線程安全。 1. Java 并發包的核心內容 并發包概述:java.util.concurrent 包及其子包提供了豐富的并發工具類,用于簡化多線程編程。主要組成部分: 高級同步結構:如 C…

Matlab數字信號處理——小波閾值法去噪分析系統

🔧 系統簡介 本系統通過 MATLAB GUI 圖形界面,集成了 小波閾值去噪算法 的各個核心模塊,可以實現以下功能: 打開語音文件:支持常見音頻格式讀取; 模擬加噪:系統內置白噪聲模擬功能&#xff0…

EDI 如何與 ERP,CRM,WMS等系統集成

在數字化浪潮下,與制造供應鏈相關產業正加速向智能化供應鏈轉型。傳統人工處理訂單、庫存和物流的方式已難以滿足下單客戶對響應速度和數據準確性的嚴苛要求。EDI技術作為企業間數據交換的核心樞紐,其與ERP、CRM、WMS等業務系統的深度集成,成…

計算機組成原理-408考點-數的表示

常見題型:C語言中的有符號數和無符號數的表示。 【例】有如下C語言程序段: short si-32767;unsigned short usisi;執行上述兩條語句后,usi的值為___。short和unsigned short均使用16位二進制數表示。 【分析】考點:同…

企業級AI開發利器:Spring AI框架深度解析與實戰

企業級AI開發利器:Spring AI框架深度解析與實戰 一、前言:Java生態的AI新紀元 在人工智能技術爆發式發展的今天,Java開發者面臨著一個新的挑戰:如何將大語言模型(LLMs)和生成式AI(GenAI&#…

【金倉數據庫征文】——選擇金倉,選擇勝利

目錄 第一部分:金倉數據庫——開創數據庫技術的新時代 1.1 金倉數據庫的技術底蘊 1.2 高可用架構與災備能力 1.3 分布式架構與彈性擴展能力 第二部分:金倉數據庫助力行業數字化轉型 2.1 電信行業:核心系統國產化替代 2.2 醫療行業&…

用C語言實現——一個中綴表達式的計算器。支持用戶輸入和動畫演示過程。

一、思路概要和知識回顧 1.思路概要 ①中綴表達式計算: 需要處理運算符的優先級,可能需要用到棧結構。 ??如何將中綴表達式轉換為后綴表達式?或者直接計算? 通常,中綴轉后綴(逆波蘭式)再…

Langchain_Agent+數據庫

本處使用Agent數據庫,可以直接執行SQL語句。可以多次循環查詢問題 前文通過chain去聯系數據庫并進行操作; 通過鏈的不斷內嵌組合,生成SQL在執行SQL再返回。 初始化 import os from operator import itemgetterimport bs4 from langchain.ch…

Python 爬蟲如何偽裝 Referer?從隨機生成到動態匹配

一、Referer 的作用與重要性 Referer 是 HTTP 請求頭中的一個字段,用于標識請求的來源頁面。它在網站的正常運行中扮演著重要角色,例如用于統計流量來源、防止惡意鏈接等。然而,對于爬蟲來說,Referer 也可能成為被識別為爬蟲的關…

Post-Processing PropertySource instance詳解 和 BeanFactoryPostProcessor詳解

PropertySourcesBeanFactoryPostProcessor詳解 1. 核心概念 BeanFactoryPostProcessor 是 Spring 框架中用于在 BeanFactory 初始化階段 對 Environment 中的 PropertySource 進行后處理的接口。它允許開發者在 Bean 創建之前 對屬性源進行動態修改,例如添加、刪除…

[C]基礎13.深入理解指針(5)

博客主頁:向不悔本篇專欄:[C]您的支持,是我的創作動力。 文章目錄 0、總結1、sizeof和strlen的對比1.1 sizeof1.2 strlen1.3 sizeof和strlen的對比 2、數組和指針筆試題解析2.1 一維數組2.2 字符數組2.2.1 代碼12.2.2 代碼22.2.3 代碼32.2.4 …

賽靈思 XCKU115-2FLVB2104I Xilinx Kintex UltraScale FPGA

XCKU115-2FLVB2104I 是 AMD Xilinx Kintex UltraScale FPGA,基于 20 nm 先進工藝,提供高達 1 451 100 個邏輯單元(Logic Cells),77 721 600 bit 的片上 RAM 資源,以及 5 520 個 DSP 切片(DSP48E…

CAPL編程_03

1_文件操作的相關函數: 讀文本文件內容 讀取文本文件操作的三部曲 1)打開文件 —— openFileRead ( ) 2)逐行讀取 —— fileGetString ( ) 、fileGetStringSZ ( ) 3)關閉文件 —— fileClose ( ) char content[100];…

2025年江西建筑安全員A證適合報考人群

江西建筑安全員A證適合報考人群 江西省建筑安全員A證(建筑施工企業主要負責人安全生產考核合格證書)主要面向建筑行業管理人員,適合以下人員報考: 1. 企業主要負責人 法人代表、總經理、分管安全副總:依法需持A證&a…

Docker安裝(Ubuntu22版)

前言 你是否還在為Linux上配置Docker而感到煩惱? 你是否還在為docker search,docker pull連接不上,而感到沮喪? 本文將解決以上你的所有煩惱!快速安裝好docker! Docker安裝 首先,我們得先卸載…