SwisTrack/版本 3/貢獻
此頁面引用的是 SwisTrack 的版本 3。 除非您仍在使用此舊版本,否則您可能希望閱讀SwisTrack 最新版本的文件。
SwisTrack 是用 C++ 編寫的,應該可以在 Windows、Linux 和 MacOS 平臺上編譯。
SwisTrack 被分成三個部分
- 跟蹤核心負責影像採集和分析
- 一個圖形使用者介面,提供用於視覺化跟蹤過程的不同步驟的工具
- 一個命令列介面
這三個部分透過 XML 描述連結在一起,該描述可以在 SwisTrack 目錄中的 swistrack.exp 檔案中找到。在這裡,跟蹤過程中的不同過程被組織成具有不同模式的元件(參見 使用 SwisTrack)。例如,對於元件input,合適的模式是來自相機的影像採集或來自檔案。
基於此描述(它還指定了引數型別,例如列表或整數),GUI 提供了相應的控制元件來修改每個引數並將其儲存到配置檔案中,配置檔案是swistrack.exp 的一個子集(例如,示例目錄中的 example.cfg)。此外,GUI 還提供了一些面板,允許在跟蹤期間更改引數,並同時觀察它們對跟蹤結果的影響(參見 使用 SwisTrack)。
另一方面,swistrack.exp 中定義的結構應該反映跟蹤核心的類層次結構。一般來說,swistrack.exp 中的每個元件都封裝在它自己的類中,而模式則是使用類成員函式中的switch語句實現的。在此,程式設計師有義務在每個類的建構函式中驗證當前操作模式及其引數是否在實際的配置檔案中提供,並在沒有提供的情況下丟擲異常。
參見 安裝 SwisTrack 以獲取有關設定開發者環境的資訊。
swistrack.exp 中的 <COMPONENTS> 部分描述了在跟蹤核心 中實現的需要使用者輸入引數的不同跟蹤步驟。
<COMPONENTS> <INPUT desc="Input"/> <SEGMENTER desc="Segmenter"/> <SEGMENTERPP desc="Segmenter Post-Processing"/> <PARTICLEFILTER desc="Particle Filter"/> <MASK desc="Mask"/> <TRACKER desc="Tracker"/> <CALIBRATION desc="Calibration"/> <OUTPUT desc="Output"/> </COMPONENTS>
例如,<SEGMENTER> 部分可能包含 2 種模式(在本示例中)
<SEGMENTER mode="0" desc="Static Background, fixed threshold" long="The image is segmented by subtracting a static background image from every frame in the video. The 'Threshold' determines the minimal difference for the gray value of an object to be recognized, and 'Max. Number' is the maximal number of contours processed (sorted by size)."> <THRESHOLD desc="Threshold" type="integer" min="1" max="150" variable="1">20</THRESHOLD> <FIXED desc="Fixed" type="boolean" variable="1">0</FIXED> <BGIMAGE desc="Background Image" type="open" param="*.bmp">example/bg.bmp</BGIMAGE> </SEGMENTER> <SEGMENTER mode="1" desc="Running Average" long="The image is segmented by subtracting a static background image from every frame in the video. The 'Threshold' determines the minimal difference for the gray value of an object to be recognized, and 'Max. Number' is the maximal number of contours processed (sorted by size). 'Alpha' is the speed of the exponential averager."> <THRESHOLD desc="Threshold" type="integer" min="1" max="150" variable="1">20</THRESHOLD> <ALPHA desc="Averaging Speed" type="double" min="0" max="1" variable="1">0.02</ALPHA> </SEGMENTER>
這裡模式 0 有三個引數(<THRESHOLD>、<FIXED> 和 <BGIMAGE>),而模式 1 則有兩個引數(<THRESHOLD>、<ALPHA>),它們型別不同。例如,<BGIMAGE> 的型別 "open" 帶有屬性 param="*.bmp",告訴 GUI 使用開啟檔案控制元件(開發者應該在應用程式中保留一個字串變數)。
在原始碼中,分段器元件可以在 Segmenter 類中找到(segmenter.cpp、segmenter.h)。然後建構函式需要如下所示
if(!IsAttrByXPath(cfgRoot,"/CFG/COMPONENTS/SEGMENTER","mode"))
throw "[Segmenter::Segmenter] Segmenter mode undefined (/CFG/COMPONENTS/SEGMENTER)";
mode=GetIntAttrByXPath(cfgRoot,"/CFG/COMPONENTS/SEGMENTER","mode");
switch(mode)
{
case 0 :
{
CreateExceptionIfEmpty(cfgRoot,"/CFG/SEGMENTER[@mode='0']");
CreateExceptionIfEmpty(cfgRoot,"/CFG/SEGMENTER[@mode='0']/BGIMAGE");
CreateExceptionIfEmpty(cfgRoot,"/CFG/SEGMENTER[@mode='0']/THRESHOLD");
CreateExceptionIfEmpty(cfgRoot,"/CFG/SEGMENTER[@mode='0']/FIXED");
}
case 1 :
{
CreateExceptionIfEmpty(cfgRoot,"/CFG/SEGMENTER[@mode='1']");
CreateExceptionIfEmpty(cfgRoot,"/CFG/SEGMENTER[@mode='1']/THRESHOLD");
CreateExceptionIfEmpty(cfgRoot,"/CFG/SEGMENTER[@mode='1']/ALPHA");
}
default :
throw "[Segmenter::Segmenter] Segmenter mode not implemented";
}
SetParameters();
引數本身是在成員函式 SetParameters() 中查詢的,該函式將在使用者在執行時更改引數時被呼叫。
下載所有必要的庫包後(不要忘記使用您的開發環境編譯它們),為 SwisTrack 核心建立一個專案。然後為 SwisTrack GUI 建立一個專案,它將核心與其他庫連結在一起。確保將這兩個專案都編譯為多執行緒 DLL。
您需要連結以下庫
- libxml++.lib
- libxml2.lib
- wxbase26_net.lib
- wxmsw26_adv.lib
- wxmsw26_core.lib
- wxbase26.lib
- wxtiff.lib
- wxjpeg.lib
- wxpng.lib
- wxzlib.lib
- wxregex.lib
- wxexpat.lib
- winmm.lib
- comctl32.lib
- rpcrt4.lib
- wsock32.lib
- oleacc.lib
- odbc32.lib
- objecttracker.lib
- 1394camera.lib
- cv.lib
- highgui.lib
- cxcore.lib
- vispolygon_dll.lib
- libgeom_dll.lib
本節介紹如何透過透過新模式擴充套件元件或透過新增新元件來擴充套件 SwisTrack 的核心功能。
- 在 swistrack.cfg 中新增一個新部分,並將 mode 屬性設定為尚未使用的數字。還要指定模式的描述及其引數
- 在代表要擴充套件的元件的類的建構函式中的 switch(mode) 語句中新增您的模式,併為每個缺失的引數丟擲異常
- 在類介面的 private 部分定義相應的變數(可以在 .h 檔案中找到)
- 在 SetParameters() 成員函式中的 switch(mode) 語句中新增您的模式,以從 XML 描述中獲取引數
- 遍歷您正在擴充套件的類的每個成員函式,並將程式碼新增到 switch 語句中,以便實現您想到的功能。如果某些功能是冗餘的,您可能希望將您的 'case' 語句放在表示您功能的 case 下,並刪除其 'break;' 語句(不要忘記在您的 case 中新增一個 break; 雖然)
- 檢視其他元件以瞭解它們的實現方式
- 從 'Component' 類繼承您的類,包括 component.h,它還包含一些用於訪問 XML 結構的便捷宏
- 您的類應該在位於您的元件上方的類中例項化;反過來,您的類需要例項化位於功能層次結構中您的元件下方的類