摘要:目標追蹤首先,我們會大致介紹八種建立在上的目標跟蹤算法。詞典包含了種的目標追蹤器行。它將目標追蹤器的命令行參數字符串映射到實際的追蹤器函數上。其中行里的目的是根據追蹤器命令行參數以及從得來的相關重要信息。
雖然我們熟知的的質心追蹤器表現得很好,但它需要我們在輸入的視頻上的每一幀運行一個目標探測器。對大多數環境來說,在每幀上進行檢測非常耗費計算力。
所以,我們想應用一種一次性的目標檢測方法,然后在之后的幀上都能進行目標追蹤,使這一任務更加快速、更高效。
這里的問題是:OpenCV能幫我們達到這種目標追蹤的目的嗎?
答案是肯定的。
OpenCV目標追蹤
首先,我們會大致介紹八種建立在OpenCV上的目標跟蹤算法。之后我會講解如何利用這些算法進行實時目標追蹤。最后,我們會比較各個OpenCV目標追蹤的效果,總結各種方法能夠適應的環境。
八種OpenCV目標追蹤安裝
無人機拍攝的視頻,用MedianFlow進行目標追蹤
你可能會驚訝OpenCV竟然有八種不同的目標追蹤工具,他們都可以運用到計算機視覺領域中。
這八種工具包括:
BOOSTING Tracker:和Haar cascades(AdaBoost)背后所用的機器學習算法相同,但是距其誕生已有十多年了。這一追蹤器速度較慢,并且表現不好,但是作為元老還是有必要提及的。(較低支持OpenCV 3.0.0)
MIL Tracker:比上一個追蹤器更較精確,但是失敗率比較高。(較低支持OpenCV 3.0.0)
KCF Tracker:比BOOSTING和MIL都快,但是在有遮擋的情況下表現不佳。(較低支持OpenCV 3.1.0)
CSRT Tracker:比KCF稍較精確,但速度不如后者。(較低支持OpenCV 3.4.2)
MedianFlow Tracker:在報錯方面表現得很好,但是對于快速跳動或快速移動的物體,模型會失效。(較低支持OpenCV 3.0.0)
TLD Tracker:我不確定是不是OpenCV和TLD有什么不兼容的問題,但是TLD的誤報非常多,所以不推薦。(較低支持OpenCV 3.0.0)
MOSSE Tracker:速度真心快,但是不如CSRT和KCF的準確率那么高,如果追求速度選它準沒錯。(較低支持OpenCV 3.4.1)
GOTURN Tracker:這是OpenCV中一深度學習為基礎的目標檢測器。它需要額外的模型才能運行,本文不詳細講解。(較低支持OpenCV 3.2.0)
我個人的建議:
如果追求高準確度,又能忍受慢一些的速度,那么就用CSRT
如果對準確度的要求不苛刻,想追求速度,那么就選KCF
純粹想節省時間就用MOSSE
從OpenCV 3開始,目標檢測器得到了快速發展,下表總結了不同版本的OpenCV中可食用的追蹤器:
開始動手
想要用OpenCV進行目標追蹤,首先打開一個新文件,將它命名為opencv_object_tracker.py,然后插入以下代碼:
我們開始輸入必須的安裝包,確保你已經安裝了OpenCV(我推薦3.4以上的版本),其次你要安裝imutils:
輸入安裝包后,我們開始分析命令行參數:
我們的命令行參數包括:
--video:到達輸入視頻文件的替代路線。如果該參數失效,那么腳本將會使用你的網絡攝像頭。
--tracker:假設默認追蹤器設置的是kcf,一整列可能的追蹤器代碼表示下一個代碼塊或下方的部分。
讓我們處理追蹤器的不同類別:
圖2中我們提到,并不是所有追蹤器都使用OpenCV 3以上的版本。在3.3版本上,同樣發生了安裝上的變化,在3.3之前,追蹤器必須用cv2. Tracker_create創造,并且要在追蹤器的名字上用大寫字符串標注(22和23行)。
對于3.3以上的版本,每個追蹤器可以用各自的函數創造,如cv2. TrackerKCF_create。詞典OPENCV_OBJECT_TRACKERS包含了7種OpenCV的目標追蹤器(30—38行)。它將目標追蹤器的命令行參數字符串映射到實際的OpenCV追蹤器函數上。
其中42行里的tracker目的是根據追蹤器命令行參數以及從OPENCV_OBJECT_TRACKERS得來的相關重要信息。
注意:這里我沒有將GOTURN加入到追蹤器設置中因為它還需要額外的模型文件。
我們還對initBB進行初始化(46行),當我們用鼠標選中目標物體時,該變量會顯示目標物體的邊界框坐標。
接下來,讓我們對視頻流和FPS進行初始化:
49—52行是訪問網絡攝像頭的步驟,這里我們設定一個一秒鐘的暫停時間,好讓攝像頭傳感器進行“熱身”。
接著--video命令行參數會出現,所以我們可以從視頻文件中對視頻流進行初始化(55—56行)。
下面是從視頻流中進行幀數迭代循環的步驟:
在65和66行中我們提取一個frame,同時在69和70行處理視頻文件中沒有幀數的情況。
為了讓我們的算法處理幀數的速度更快,我們用resize將輸入的視頻幀調整為50像素(74行),這里處理的數據越少,速度就會越快。
之后,我們提取視頻幀的寬度和高度,之后我們會用到高度(75行)。
目標物體選定之后,我們就可以用以下代碼進行處理:
如果目標物體已經被選定,我們需要不斷更新目標物體的位置,為了做到這一點,我們在80行使用update方法,它會定位目標物體的新位置并且返回一個success和box值。
如果順利的話,我們可以在frame中得到更新后的邊界框位置。注意,追蹤器可能會跟丟目標物并且報錯,所以success可能不會一直是True。接著更新FPS估計器。
接著,讓我們展示一下frame,以及用鼠標選取目標物體:
我們將展示frame,并且繼續迭代循環,鍵入其他指令才會停止。
當鍵入“s”后,我們用cv2.selectROI“選擇”一個目標ROI。這一函數可以讓你在視頻暫停的時候手動選擇一個ROI:
用戶必須畫出邊界框后按回車或空格鍵來確定所選區域。如果你需要重新選擇,就按“ESCAPE”鍵。
同樣,我們還能用真實的目標探測器來進行手動選擇。
最后,如果視頻有更多的幀,或者出現了“quit”的情況,如何退出這一循環:
最后一個模塊展示了我們如何停止循環,這時所有的指標都輸出并且窗口關閉。
目標追蹤結果
提示:為了確保你跟上本文的進度,并且用到了文章中的OpenCV方法,請先確保你在“下載資料”中下載了代碼和視頻。
之后,打開一個終端并執行以下命令:
如果你下載了本教程的源代碼和視頻,那么--video的可用參數在以下文件中:
american_pharoah.mp4
dashcam_boston.mp4
drone.mp4
nascar_01.mp4
nascar_02.mp4
race.mp4
……
--tracker中的參數在:
csrt
kcf
boosting
mil
tld
medianflow
mosse
你也可以用計算機的攝像頭:
總結
這篇文章講解了如何用OpenCV進行目標物體追蹤。具體來說,我們回顧了庫里的八種算法:
CSRF
KCF
Boosting
MIL
TLD
MedianFlow
MOSSE
GOTURN
我們可以將OpenCV的這八種追蹤器用于不同的任務,包括短跑比賽、賽馬、賽車、無人機追蹤等高速視頻上。如需要文中的代碼和視頻,請點擊下方原文地址獲取。
原文地址:www.pyimagesearch.com/2018/07/30/opencv-object-tracking/
聲明:文章收集于網絡,如有侵權,請聯系小編及時處理,謝謝!
歡迎加入本站公開興趣群商業智能與數據分析群
興趣范圍包括各種讓數據產生價值的辦法,實際應用案例分享與討論,分析工具,ETL工具,數據倉庫,數據挖掘工具,報表系統等全方位知識
QQ群:81035754
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/4808.html
??歡迎訂閱《從實戰學python》專欄,用python實現爬蟲、辦公自動化、數據可視化、人工智能等各個方向的實戰案例,有趣又有用!?? 更多精品專欄簡介點這里 治愈生活的良方 就是保持對生活的熱愛 前言 哈嘍,大家好,我是一條。 每次和女朋友出去玩,拍照是必須的,天氣好還行,天氣要是不好,加上我這破手機,那拍的簡直慘不忍睹,自己都不過去。 但是沒什么能難倒程序員的,為了不挨罵,連夜寫出去霧...
閱讀 480·2023-04-25 17:26
閱讀 1499·2021-08-05 09:58
閱讀 1965·2019-08-30 13:17
閱讀 950·2019-08-28 17:52
閱讀 1065·2019-08-26 18:27
閱讀 1419·2019-08-26 14:05
閱讀 3615·2019-08-26 14:05
閱讀 1593·2019-08-26 10:45