基于OpenCV4.2實(shí)現(xiàn)單目標(biāo)跟蹤
在本教程中,我們將學(xué)習(xí)使用OpenCV跟蹤對(duì)象。OpenCV 3.0開(kāi)始引入跟蹤API。我們將學(xué)習(xí)如何和何時(shí)使用OpenCV 4.2中可用的8種不同的跟蹤器- BOOSTING, MIL, KCF, TLD, MEDIANFLOW, GOTURN, MOSSE和CSRT。我們還將學(xué)習(xí)現(xiàn)代跟蹤算法背后的一般理論。
1.什么是目標(biāo)跟蹤
簡(jiǎn)單地說(shuō),在視頻的連續(xù)幀中定位一個(gè)對(duì)象稱為跟蹤。
這個(gè)定義聽(tīng)起來(lái)很簡(jiǎn)單,但在計(jì)算機(jī)視覺(jué)和機(jī)器學(xué)習(xí)中,跟蹤是一個(gè)非常廣泛的術(shù)語(yǔ),它包含了概念相似但技術(shù)不同的想法。例如,以下所有不同但相關(guān)的思想通常都是在對(duì)象跟蹤中研究的
1.Dense Optical flow(稠密光流):這些算法有助于估計(jì)視頻幀中每個(gè)像素的運(yùn)動(dòng)矢量。
2.Sparse optical flow(稀疏光流):這些算法,如Kanade-Lucas-Tomashi (KLT)特征跟蹤器,跟蹤圖像中幾個(gè)特征點(diǎn)的位置。
3.Kalman Filtering(卡爾曼濾波):一種非常流行的信號(hào)處理算法,用于基于先驗(yàn)運(yùn)動(dòng)信息預(yù)測(cè)運(yùn)動(dòng)目標(biāo)的位置。該算法的早期應(yīng)用之一是導(dǎo)彈制導(dǎo)!
4.Meanshift and Camshift:這些是定位密度函數(shù)最大值的算法。它們也被用于跟蹤。
5.Single object trackers(單一對(duì)象追蹤器):在這類跟蹤器中,第一幀使用一個(gè)矩形來(lái)標(biāo)記我們想要跟蹤的對(duì)象的位置。然后使用跟蹤算法在隨后的幀中跟蹤目標(biāo)。在大多數(shù)現(xiàn)實(shí)生活中的應(yīng)用程序中,這些跟蹤器是與對(duì)象檢測(cè)器結(jié)合使用的。
6.Multiple object track finding algorithms(多目標(biāo)追蹤算法):在我們有快速目標(biāo)檢測(cè)器的情況下,在每幀中檢測(cè)多個(gè)目標(biāo),然后運(yùn)行軌跡查找算法來(lái)識(shí)別一幀中的哪個(gè)矩形對(duì)應(yīng)于下一幀中的矩形是有意義的。
2.跟蹤與檢測(cè)
如果你曾經(jīng)玩過(guò)OpenCV人臉檢測(cè),你知道它是實(shí)時(shí)工作的,你可以很容易地在每一幀中檢測(cè)人臉。那么,為什么一開(kāi)始就需要跟蹤呢?讓我們來(lái)探討一下你可能想要在視頻中跟蹤對(duì)象而不僅僅是重復(fù)檢測(cè)的不同原因。
1.跟蹤比檢測(cè)快:通常跟蹤算法要比檢測(cè)算法快。原因很簡(jiǎn)單。當(dāng)您在跟蹤前一幀中檢測(cè)到的對(duì)象時(shí),您會(huì)對(duì)該對(duì)象的外觀有很多了解。你也知道在前一個(gè)坐標(biāo)系中的位置以及它運(yùn)動(dòng)的方向和速度。所以在下一幀中,你可以利用所有這些信息來(lái)預(yù)測(cè)下一幀中物體的位置,并對(duì)物體的預(yù)期位置做一個(gè)小搜索來(lái)精確地定位物體。一個(gè)好的跟蹤算法會(huì)使用它所擁有的關(guān)于目標(biāo)的所有信息,而檢測(cè)算法總是從頭開(kāi)始。因此,在設(shè)計(jì)一個(gè)高效的系統(tǒng)時(shí),通常在每n幀上進(jìn)行目標(biāo)檢測(cè),在n-1幀之間使用跟蹤算法。為什么我們不直接在第一幀檢測(cè)目標(biāo),然后跟蹤它呢?跟蹤確實(shí)可以從它所擁有的額外信息中獲益,但如果一個(gè)物體在障礙物后面停留了很長(zhǎng)一段時(shí)間,或者它移動(dòng)得太快,以至于跟蹤算法無(wú)法跟上,你也會(huì)失去對(duì)它的跟蹤。跟蹤算法也經(jīng)常會(huì)累積誤差,跟蹤對(duì)象的包圍框會(huì)慢慢地偏離跟蹤對(duì)象。我們會(huì)經(jīng)常使用檢測(cè)算法解決跟蹤算法的這些問(wèn)題。檢測(cè)算法基于大數(shù)據(jù)訓(xùn)練,因此,他們對(duì)對(duì)象的一般類別有更多的了解。另一方面,跟蹤算法更了解它們所跟蹤的類的具體實(shí)例。
2.當(dāng)檢測(cè)失敗時(shí),跟蹤可以提供幫助:如果你在視頻中運(yùn)行人臉檢測(cè)器,而這個(gè)人的臉被物體遮擋,人臉檢測(cè)器很可能會(huì)失敗。一個(gè)好的跟蹤算法將解決某種程度的遮擋。
3.跟蹤保護(hù)身份ID:對(duì)象檢測(cè)的輸出是一個(gè)包含對(duì)象的矩形數(shù)組。但是,該對(duì)象沒(méi)有附加身份。例如,在下面的視頻中,一個(gè)檢測(cè)紅點(diǎn)的探測(cè)器將輸出與它在一幀中檢測(cè)到的所有點(diǎn)相對(duì)應(yīng)的矩形。在下一幀中,它將輸出另一個(gè)矩形數(shù)組。在第一幀中,一個(gè)特定的點(diǎn)可能由數(shù)組中位置10的矩形表示,而在第二幀中,它可能位于位置17。當(dāng)在幀上使用檢測(cè)時(shí),我們不知道哪個(gè)矩形對(duì)應(yīng)哪個(gè)對(duì)象。另一方面,追蹤提供了一種將這些點(diǎn)連接起來(lái)的方法!
3.使用OpenCV 4實(shí)現(xiàn)對(duì)象跟蹤
OpenCV 4附帶了一個(gè)跟蹤API,它包含了許多單對(duì)象跟蹤算法的實(shí)現(xiàn)。在OpenCV 4.2中有8種不同的跟蹤器可用- BOOSTING, MIL, KCF, TLD, MEDIANFLOW, GOTURN, MOSSE,和CSRT。
注意: OpenCV 3.2實(shí)現(xiàn)了這6個(gè)跟蹤器- BOOSTING, MIL, TLD, MEDIANFLOW, MOSSE和GOTURN。OpenCV 3.1實(shí)現(xiàn)了這5個(gè)跟蹤器- BOOSTING, MIL, KCF, TLD, MEDIANFLOW。OpenCV 3.0實(shí)現(xiàn)了以下4個(gè)跟蹤器- BOOSTING, MIL, TLD, MEDIANFLOW。
在OpenCV 3.3中,跟蹤API已經(jīng)改變。代碼檢查版本,然后使用相應(yīng)的API。
在簡(jiǎn)要描述這些算法之前,讓我們先看看它們的設(shè)置和使用方法。在下面的注釋代碼中,我們首先通過(guò)選擇跟蹤器類型來(lái)設(shè)置跟蹤器——BOOSTING、MIL、KCF、TLD、MEDIANFLOW、GOTURN、MOSSE或CSRT。然后我們打開(kāi)一段視頻,抓取一幀。我們定義了一個(gè)包含第一幀對(duì)象的邊界框,并用第一幀和邊界框初始化跟蹤器。最后,我們從視頻中讀取幀,并在循環(huán)中更新跟蹤器,以獲得當(dāng)前幀的新包圍框。隨后顯示結(jié)果。
3.1使用OpenCV 4實(shí)現(xiàn)對(duì)象跟蹤 C++代碼
#include <opencv2/opencv.hpp> #include <opencv2/tracking.hpp> #include <opencv2/core/ocl.hpp> using namespace cv; using namespace std; // 轉(zhuǎn)換為字符串 #define SSTR( x ) static_cast< std::ostringstream & >( ( std::ostringstream() << std::dec << x ) ).str() int main(int argc, char **argv) { // OpenCV 3.4.1中的跟蹤器類型列表 string trackerTypes[8] = {"BOOSTING", "MIL", "KCF", "TLD","MEDIANFLOW", "GOTURN", "MOSSE", "CSRT"}; // vector <string> trackerTypes(types, std::end(types)); // 創(chuàng)建一個(gè)跟蹤器 string trackerType = trackerTypes[2]; Ptr<Tracker> tracker; #if (CV_MINOR_VERSION < 3) { tracker = Tracker::create(trackerType); } #else { if (trackerType == "BOOSTING") tracker = TrackerBoosting::create(); if (trackerType == "MIL") tracker = TrackerMIL::create(); if (trackerType == "KCF") tracker = TrackerKCF::create(); if (trackerType == "TLD") tracker = TrackerTLD::create(); if (trackerType == "MEDIANFLOW") tracker = TrackerMedianFlow::create(); if (trackerType == "GOTURN") tracker = TrackerGOTURN::create(); if (trackerType == "MOSSE") tracker = TrackerMOSSE::create(); if (trackerType == "CSRT") tracker = TrackerCSRT::create(); } #endif // 讀取視頻 VideoCapture video("videos/chaplin.mp4"); // 如果視頻沒(méi)有打開(kāi),退出 if(!video.isOpened()) { cout << "Could not read video file" << endl; return 1; } // 讀第一幀 Mat frame; bool ok = video.read(frame); // 定義初始邊界框 Rect2d bbox(287, 23, 86, 320); // 取消注釋下面的行以選擇一個(gè)不同的邊界框 // bbox = selectROI(frame, false); // 顯示邊界框 rectangle(frame, bbox, Scalar( 255, 0, 0 ), 2, 1 ); imshow("Tracking", frame); tracker->init(frame, bbox); while(video.read(frame)) { // 啟動(dòng)定時(shí)器 double timer = (double)getTickCount(); // 更新跟蹤結(jié)果 bool ok = tracker->update(frame, bbox); // 計(jì)算每秒幀數(shù)(FPS) float fps = getTickFrequency() / ((double)getTickCount() - timer); if (ok) { // 跟蹤成功:繪制被跟蹤對(duì)象 rectangle(frame, bbox, Scalar( 255, 0, 0 ), 2, 1 ); } else { // 跟蹤失敗 putText(frame, "Tracking failure detected", Point(100,80), FONT_HERSHEY_SIMPLEX, 0.75, Scalar(0,0,255),2); } // 在幀上顯示跟蹤器類型 putText(frame, trackerType + " Tracker", Point(100,20), FONT_HERSHEY_SIMPLEX, 0.75, Scalar(50,170,50),2); // 幀顯示FPS putText(frame, "FPS : " + SSTR(int(fps)), Point(100,50), FONT_HERSHEY_SIMPLEX, 0.75, Scalar(50,170,50), 2); // 顯示幀 imshow("Tracking", frame); // 按ESC鍵退出。 int k = waitKey(1); if(k == 27) { break; } } }
3.2使用OpenCV 4實(shí)現(xiàn)對(duì)象跟蹤 Python代碼
import cv2 import sys (major_ver, minor_ver, subminor_ver) = (cv2.__version__).split('.')? if __name__ == '__main__' : # 建立追蹤器 # 除了MIL之外,您還可以使用 tracker_types = ['BOOSTING', 'MIL','KCF', 'TLD', 'MEDIANFLOW', 'GOTURN', 'MOSSE', 'CSRT'] tracker_type = tracker_types[2] if int(minor_ver) < 3: tracker = cv2.Tracker_create(tracker_type) else: if tracker_type == 'BOOSTING': tracker = cv2.TrackerBoosting_create() if tracker_type == 'MIL': tracker = cv2.TrackerMIL_create() if tracker_type == 'KCF': tracker = cv2.TrackerKCF_create() if tracker_type == 'TLD': tracker = cv2.TrackerTLD_create() if tracker_type == 'MEDIANFLOW': tracker = cv2.TrackerMedianFlow_create() if tracker_type == 'GOTURN': tracker = cv2.TrackerGOTURN_create() if tracker_type == 'MOSSE': tracker = cv2.TrackerMOSSE_create() if tracker_type == "CSRT": tracker = cv2.TrackerCSRT_create() # 讀取視頻 video = cv2.VideoCapture("videos/chaplin.mp4") # 如果視頻沒(méi)有打開(kāi),退出。 if not video.isOpened(): print "Could not open video" sys.exit() # 讀第一幀。 ok, frame = video.read() if not ok: print('Cannot read video file') sys.exit() # 定義一個(gè)初始邊界框 bbox = (287, 23, 86, 320) # 取消注釋下面的行以選擇一個(gè)不同的邊界框 # bbox = cv2.selectROI(frame, False) # 用第一幀和包圍框初始化跟蹤器 ok = tracker.init(frame, bbox) while True: # 讀取一個(gè)新的幀 ok, frame = video.read() if not ok: break # 啟動(dòng)計(jì)時(shí)器 timer = cv2.getTickCount() # 更新跟蹤器 ok, bbox = tracker.update(frame) # 計(jì)算幀率(FPS) fps = cv2.getTickFrequency() / (cv2.getTickCount() - timer); # 繪制包圍框 if ok: # 跟蹤成功 p1 = (int(bbox[0]), int(bbox[1])) p2 = (int(bbox[0] + bbox[2]), int(bbox[1] + bbox[3])) cv2.rectangle(frame, p1, p2, (255,0,0), 2, 1) else : # 跟蹤失敗 cv2.putText(frame, "Tracking failure detected", (100,80), cv2.FONT_HERSHEY_SIMPLEX, 0.75,(0,0,255),2) # 在幀上顯示跟蹤器類型名字 cv2.putText(frame, tracker_type + " Tracker", (100,20), cv2.FONT_HERSHEY_SIMPLEX, 0.75, (50,170,50),2); # 在幀上顯示幀率FPS cv2.putText(frame, "FPS : " + str(int(fps)), (100,50), cv2.FONT_HERSHEY_SIMPLEX, 0.75, (50,170,50), 2); # 顯示結(jié)果 cv2.imshow("Tracking", frame) # 按ESC鍵退出 k = cv2.waitKey(1) & 0xff if k == 27 : break
4.跟蹤算法解析
在本節(jié)中,我們將深入研究不同的跟蹤算法。我們的目標(biāo)不是對(duì)每一個(gè)跟蹤器都有一個(gè)深刻的理論理解,而是從實(shí)際的角度來(lái)理解它們。
讓我首先解釋一些跟蹤的一般原則。在跟蹤中,我們的目標(biāo)是在當(dāng)前幀中找到一個(gè)對(duì)象,因?yàn)槲覀円呀?jīng)成功地在所有(或幾乎所有)之前的幀中跟蹤了這個(gè)對(duì)象。
因?yàn)槲覀円恢备檶?duì)象直到當(dāng)前幀,所以我們知道它是如何移動(dòng)的。換句話說(shuō),我們知道運(yùn)動(dòng)模型的參數(shù)。運(yùn)動(dòng)模型只是一種花哨的說(shuō)法,表示你知道物體在前幾幀中的位置和速度(速度+運(yùn)動(dòng)方向)。如果你對(duì)物體一無(wú)所知,你可以根據(jù)當(dāng)前的運(yùn)動(dòng)模型預(yù)測(cè)新的位置,你會(huì)非常接近物體的新位置。
但我們有比物體運(yùn)動(dòng)更多的信息。我們知道物體在之前的每一幀中的樣子。換句話說(shuō),我們可以構(gòu)建一個(gè)對(duì)對(duì)象的外觀進(jìn)行編碼的外觀模型。該外觀模型可用于在運(yùn)動(dòng)模型預(yù)測(cè)的小鄰域內(nèi)搜索位置,從而更準(zhǔn)確地預(yù)測(cè)物體的位置。
運(yùn)動(dòng)模型預(yù)測(cè)了物體的大致位置。外觀模型對(duì)這個(gè)估計(jì)進(jìn)行微調(diào),以提供基于外觀的更準(zhǔn)確的估計(jì)。
如果對(duì)象非常簡(jiǎn)單,并且沒(méi)有太多改變它的外觀,我們可以使用一個(gè)簡(jiǎn)單的模板作為外觀模型,并尋找該模板。然而,現(xiàn)實(shí)生活并沒(méi)有那么簡(jiǎn)單。物體的外觀會(huì)發(fā)生巨大的變化。為了解決這個(gè)問(wèn)題,在許多現(xiàn)代跟蹤器中,這個(gè)外觀模型是一個(gè)以在線方式訓(xùn)練的分類器。別慌!讓我用更簡(jiǎn)單的術(shù)語(yǔ)解釋一下。
分類器的工作是將圖像中的矩形區(qū)域分類為物體或背景。分類器接收?qǐng)D像patch作為輸入,并返回0到1之間的分?jǐn)?shù),表示圖像patch包含該對(duì)象的概率。當(dāng)完全確定圖像patch是背景時(shí),分?jǐn)?shù)為0;當(dāng)完全確定patch是對(duì)象時(shí),分?jǐn)?shù)為1。
在機(jī)器學(xué)習(xí)中,我們用“在線”這個(gè)詞來(lái)指在運(yùn)行時(shí)進(jìn)行動(dòng)態(tài)訓(xùn)練的算法。離線分類器可能需要數(shù)千個(gè)示例來(lái)訓(xùn)練一個(gè)分類器,但在線分類器通常在運(yùn)行時(shí)使用很少的示例進(jìn)行訓(xùn)練。
通過(guò)向分類器輸入正(對(duì)象)和負(fù)(背景)的例子來(lái)訓(xùn)練分類器。如果您想要構(gòu)建一個(gè)用于檢測(cè)貓的分類器,您可以使用數(shù)千張包含貓的圖像和數(shù)千張不包含貓的圖像來(lái)訓(xùn)練它。這樣分類器學(xué)會(huì)區(qū)分什么是貓,什么不是。在構(gòu)建一個(gè)在線分類器時(shí),我們沒(méi)有機(jī)會(huì)擁有數(shù)千個(gè)正面和負(fù)面類的例子。
讓我們看看不同的跟蹤算法是如何處理在線訓(xùn)練的這個(gè)問(wèn)題的。
4.1 BOOSTING Tracker
該跟蹤器基于AdaBoost的在線版本——基于HAAR級(jí)聯(lián)的人臉檢測(cè)器內(nèi)部使用的算法。這個(gè)分類器需要在運(yùn)行時(shí)用對(duì)象的正面和反面例子進(jìn)行訓(xùn)練。將用戶提供的初始包圍盒(或其他目標(biāo)檢測(cè)算法提供的初始包圍盒)作為目標(biāo)的正例,將包圍盒外的許多圖像patch作為背景。
給定一個(gè)新的幀,分類器在前一個(gè)位置附近的每個(gè)像素上運(yùn)行,并記錄分類器的得分。對(duì)象的新位置是分?jǐn)?shù)最高的位置?,F(xiàn)在分類器又多了一個(gè)正樣本。當(dāng)更多的幀進(jìn)來(lái)時(shí),分類器就會(huì)用這些額外的數(shù)據(jù)更新。
優(yōu)點(diǎn):沒(méi)有。 這個(gè)算法已經(jīng)有10年的歷史了,而且運(yùn)行良好,但我找不到使用它的好理由,特別是當(dāng)基于類似原則的其他高級(jí)跟蹤器(MIL, KCF)可用時(shí)。
缺點(diǎn):跟蹤性能平庸。 它不能可靠地知道何時(shí)跟蹤失敗了。
4.2 MIL Tracker
這個(gè)跟蹤器在思想上與上述的BOOSTING跟蹤器相似。最大的區(qū)別是,它不是只考慮對(duì)象的當(dāng)前位置作為一個(gè)正樣本,而是在當(dāng)前位置周圍的一個(gè)小領(lǐng)域中尋找?guī)讉€(gè)潛在的正樣本。你可能會(huì)認(rèn)為這不是一個(gè)好主意,因?yàn)樵诖蠖鄶?shù)這些“正樣本”的例子中,物體不是居中的。
這就是多實(shí)例學(xué)習(xí) (MIL) 的用武之地。在 MIL 中,您不指定正面和負(fù)面示例,而是指定正面和負(fù)面“袋子”。正面“袋子”中的圖像集合并不都是正例。取而代之的是,正面袋子中只有一張圖像需要是正面的例子!
在我們的示例中,一個(gè)正面袋子包含以對(duì)象當(dāng)前位置為中心的patch,以及它周圍的一個(gè)小鄰域中的patch。即使被跟蹤對(duì)象的當(dāng)前位置不準(zhǔn)確,當(dāng)來(lái)自當(dāng)前位置附近的樣本被放入正面袋子中時(shí),這個(gè)正面袋子很有可能包含至少一個(gè)對(duì)象很好地居中的圖像。
優(yōu)點(diǎn):性能很好。 它不像BOOSTING跟蹤器那樣漂移,并且在部分遮擋下做了合理的工作。如果你正在使用OpenCV 3.0,這可能是你可用的最好的跟蹤器。但是,如果您使用的是更高的版本,請(qǐng)考慮KCF。
缺點(diǎn): 無(wú)法可靠地報(bào)告跟蹤失敗。不能從完全遮擋中恢復(fù)。
4.3 KCF Tracker
KFC 代表Kernelized Correlation Filters(Kernelized相關(guān)性過(guò)濾器)。該跟蹤器建立在前兩個(gè)跟蹤器中提出的想法之上。該跟蹤器利用了 MIL 跟蹤器中使用的多個(gè)正樣本具有較大重疊區(qū)域的事實(shí)。這種重疊數(shù)據(jù)導(dǎo)致了一些很好的數(shù)學(xué)特性,該跟蹤器利用這些特性使跟蹤更快、更準(zhǔn)確。
優(yōu)點(diǎn):準(zhǔn)確性和速度都優(yōu)于 MIL,它報(bào)告的跟蹤失敗比 BOOSTING 和 MIL 更好。 如果您使用的是 OpenCV 3.1 及更高版本,我建議將其用于大多數(shù)應(yīng)用程序。
缺點(diǎn): 不能從完全遮擋中恢復(fù)。
4.4 TLD Tracker
TLD 代表跟蹤、學(xué)習(xí)和檢測(cè)。顧名思義,這個(gè)跟蹤器將長(zhǎng)期跟蹤任務(wù)分解為三個(gè)部分——(短期)跟蹤、學(xué)習(xí)和檢測(cè)。從作者的論文中,“跟蹤器逐幀跟蹤對(duì)象。檢測(cè)器定位到目前為止已觀察到的所有外觀,并在必要時(shí)糾正跟蹤器。
學(xué)習(xí)估計(jì)檢測(cè)器的錯(cuò)誤并對(duì)其進(jìn)行更新以避免將來(lái)出現(xiàn)這些錯(cuò)誤。”這個(gè)跟蹤器的輸出往往會(huì)有點(diǎn)跳躍。例如,如果您正在跟蹤行人并且場(chǎng)景中有其他行人,則此跟蹤器有時(shí)可以臨時(shí)跟蹤與您打算跟蹤的行人不同的行人。從積極的方面來(lái)說(shuō),這條軌跡似乎可以在更大的范圍、運(yùn)動(dòng)和遮擋范圍內(nèi)跟蹤對(duì)象。如果您有一個(gè)對(duì)象隱藏在另一個(gè)對(duì)象后面的視頻序列,則此跟蹤器可能是一個(gè)不錯(cuò)的選擇。
優(yōu)點(diǎn):在多個(gè)幀的遮擋下效果最佳。此外,跟蹤最好的規(guī)模變化。
缺點(diǎn):大量的誤報(bào)使得它幾乎無(wú)法使用。
4.5 MEDIANFLOW Tracker
在內(nèi)部,該跟蹤器在時(shí)間上向前和向后跟蹤對(duì)象,并測(cè)量這兩個(gè)軌跡之間的差異。最小化這種 ForwardBackward 誤差使他們能夠可靠地檢測(cè)跟蹤失敗并在視頻序列中選擇可靠的軌跡。
在我的測(cè)試中,我發(fā)現(xiàn)該跟蹤器在運(yùn)動(dòng)可預(yù)測(cè)且較小時(shí)效果最佳。與其他跟蹤器即使在跟蹤明顯失敗時(shí)仍繼續(xù)運(yùn)行不同,該跟蹤器知道跟蹤何時(shí)失敗。
優(yōu)點(diǎn):出色的跟蹤失敗報(bào)告。當(dāng)運(yùn)動(dòng)是可預(yù)測(cè)的并且沒(méi)有遮擋時(shí)效果很好。
缺點(diǎn):在大運(yùn)動(dòng)下失敗。
4.6 GOTURN tracker
在跟蹤器類的所有跟蹤算法中,這是唯一一種基于卷積神經(jīng)網(wǎng)絡(luò) (CNN) 的算法。從 OpenCV 文檔中,我們知道它“對(duì)視點(diǎn)變化、光照變化和變形具有魯棒性”。但它不能很好地處理遮擋。
注意:GOTURN 是基于 CNN 的跟蹤器,使用 Caffe 模型進(jìn)行跟蹤。 Caffe 模型和 proto 文本文件必須存在于代碼所在的目錄中。這些文件也可以從 opencv_extra 存儲(chǔ)庫(kù)下載、連接并在使用前提取。
4.7 MOSSE tracker
最小輸出平方誤差和 (MOSSE) 使用自適應(yīng)相關(guān)性進(jìn)行對(duì)象跟蹤,在使用單幀初始化時(shí)會(huì)產(chǎn)生穩(wěn)定的相關(guān)性濾波器。 MOSSE 跟蹤器對(duì)光照、比例、姿勢(shì)和非剛性變形的變化具有魯棒性。它還根據(jù)峰值旁瓣(peak-to-sidelobe)比檢測(cè)遮擋,這使跟蹤器能夠在對(duì)象重新出現(xiàn)時(shí)暫停并從中斷的地方恢復(fù)。 MOSSE 跟蹤器還以更高的 fps(450 fps 甚至更高)運(yùn)行。除此之外,它還非常容易執(zhí)行,與其他復(fù)雜追蹤器一樣準(zhǔn)確,而且速度更快。但是,在性能尺度上,它落后于基于深度學(xué)習(xí)的跟蹤器。
4.8 CSRT tracker
在DCF-CSR (Discriminative Correlation Filter with Channel and Spatial Reliability, DCF-CSR)中,我們使用空間可靠性映射來(lái)調(diào)整濾波器的支持度,使其適應(yīng)幀中被選擇區(qū)域的跟蹤部分。這確保了所選區(qū)域的放大和定位,并改進(jìn)了對(duì)非矩形區(qū)域或?qū)ο蟮母?。它只使?個(gè)標(biāo)準(zhǔn)特性(hog和Colornames)。它也運(yùn)行在一個(gè)相對(duì)較低的fps (25 fps),但提供了較高的目標(biāo)跟蹤精度。
到此這篇關(guān)于基于OpenCV4.2實(shí)現(xiàn)單目標(biāo)跟蹤的文章就介紹到這了,更多相關(guān)OpenCV單目標(biāo)跟蹤內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
對(duì)tensorflow 的模型保存和調(diào)用實(shí)例講解
今天小編就為大家分享一篇對(duì)tensorflow 的模型保存和調(diào)用實(shí)例講解,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2018-07-07win7上python2.7連接mysql數(shù)據(jù)庫(kù)的方法
這篇文章主要介紹了win7上python2.7連接mysql數(shù)據(jù)庫(kù)的方法,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2017-01-01python讀取相對(duì)路徑和絕對(duì)路徑的方法
這篇文章主要介紹了python讀取相對(duì)路徑和絕對(duì)路徑,下面的路徑介紹針對(duì)windows,在編寫(xiě)的py文件中打開(kāi)文件的時(shí)候經(jīng)常見(jiàn)到下面其中路徑的表達(dá)方式,需要的朋友可以參考下2023-02-02Centos 升級(jí)到python3后pip 無(wú)法使用的解決方法
今天小編就為大家分享一篇Centos 升級(jí)到python3后pip 無(wú)法使用的解決方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2018-06-06keras實(shí)現(xiàn)多種分類網(wǎng)絡(luò)的方式
這篇文章主要介紹了keras實(shí)現(xiàn)多種分類網(wǎng)絡(luò)的方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2020-06-06PyInstaller將Python腳本打包為.exe可執(zhí)行文件的步驟詳解
Python是一門(mén)強(qiáng)大而靈活的編程語(yǔ)言,為了方便共享和部署,我們可以將 Python 腳本打包為可執(zhí)行文件(.exe),這樣其他用戶就無(wú)需安裝 Python環(huán)境,直接運(yùn)行可執(zhí)行文件即可,本文將介紹如何使用PyInstaller 工具實(shí)現(xiàn)這一目標(biāo),需要的朋友可以參考下2023-12-12淺談pyhton學(xué)習(xí)中出現(xiàn)的各種問(wèn)題(新手必看)
下面小編就為大家?guī)?lái)一篇淺談pyhton學(xué)習(xí)中出現(xiàn)的各種問(wèn)題(新手必看)。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2017-05-05pytorch中 gpu與gpu、gpu與cpu 在load時(shí)相互轉(zhuǎn)化操作
這篇文章主要介紹了pytorch模型載入之gpu和cpu互轉(zhuǎn)操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2020-05-05