雖然opencv官方提供的Blob Tracking Tests工程具有一次編譯可以驗證很多演算法的特性,但是初學者往往不知道寫什麼樣的命令來使用這個工程,為了我便於理解這個vs架構,寫了一個很簡單的,可以直接使用的Blob Tracking Tests工程。這個工程最大的功能就是使用簡單,代碼簡單,比原帶的工程的代碼易讀,但功能少了很多很多,也會造成記憶體的泄露,但可以協助初學vs架構的人快速入門。在vs2010下直接按下F5就可以運行。使用時,只要把main函數,還有runblobtrackingauto函數替換成下面的函數就可以了。
static int myRunBlobTrackingAuto(CvCapture *pCap ,CvBlobTrackerAuto *pTracker,char*fgaviName= NULL,char *btaviName= NULL){int nFrameNum = 0;IplImage *pImg = NULL;IplImage*pMask = NULL;IplImage *pFG =NULL;int key = 0;for(nFrameNum = 0;pCap && (key=cvWaitKey(2) != 27); nFrameNum++){pImg = cvQueryFrame(pCap);if(!pImg)break;cvShowImage("frame",pImg);pTracker->Process(pImg,pMask);pFG=pTracker->GetFGMask();cvShowImage("pFG",pFG);cvShowImage("mask",pMask);//cvReleaseImage(&pImg);//cvReleaseImage(&pMask);}return 0;}int main(int argc,char *argv){CvCapture *capture = NULL;CvBlobTrackerAutoParam1 param = {0};CvBlobTrackerAuto * pTracker = NULL;//架構類DefModule_FGDetector *pFGModule = NULL;//這是在最前面的檔案中定義了的。這個結構中是包含CvFGDetector類的DefModule_BlobDetector * pBDModule = NULL;DefModule_BlobTracker* pBTModule = NULL;DefModule_BlobTrackPostProc*pBTPostProcModule = NULL;DefModule_BlobTrackGen*pBTGenModule = NULL;DefModule_BlobTrackAnalysis*pBTAnalysisModule = NULL;//nick_name ;char *fgName= NULL;char *fgAviName= NULL;char *btAviName= NULL;char *bdName = NULL;char *btName= NULL;char *btGenName= NULL;char *aviName = NULL;//儲存軌跡的檔案名稱。char *trackName= NULL;//分析軌跡的檔案名稱。char *btaName=NULL;char *FGTrainFrames=NULL;#ifndef WIN32cvInitSystem(argc,argv);#endif//字串的初始 化。fgName ="myfg";fgAviName="fgAviName.avi";//aviName ="video.avi";trackName="track.csv";btaName="bta.csv";//網路攝影機初始化。//capture= cvCreateCaputeif(aviName )capture =cvCaptureFromFile(aviName);elsecapture = cvCreateCameraCapture(-1);pFGModule=&FGDetector_Modules[0];//採取直接賦值的方式。pBDModule= &BlobDetector_Modules[0];pBTModule= &BlobTracker_Modules[0];pBTPostProcModule=&BlobTrackPostProc_Modules[0];pBTGenModule=&BlobTrackGen_Modules[0];pBTAnalysisModule=&BlobTrackAnalysis_Modules[0];param.FGTrainFrames=FGTrainFrames?atoi(FGTrainFrames):0;//定義從第幾幀開始計數。param.pFG= pFGModule->create();if(!param.pFG)//建立失敗。。{puts("建立前景背景器錯誤!程式將退出");return 1;}param.pFG->SetNickName(pFGModule->nickname);param.pFG->ParamUpdate();//這裡是不是有問題。param.pBD = pBDModule->create();if(!param.pBD)std::cout<<"建立新的團塊檢測器錯誤!"<<std::endl;param.pBD->SetNickName(pBDModule->nickname);param.pBD->ParamUpdate();param.pBT = pBTModule->create();if(!param.pBT)std::cout<<"建立目標跟蹤模組失敗"<<std::endl;param.pBT->SetNickName(pBTModule->nickname);param.pBT->ParamUpdate();//如果pbtmodule模組不為空白,儲存軌跡的檔案名稱不為空白,並且這個模組的create函數指標不為空白if(pBTGenModule && trackName && pBTGenModule->create){param.pBTGen=pBTGenModule->create();param.pBTGen->SetFileName(trackName);}if(param.pBTGen)//如果前面的執行成功了,並且,建立成功了。{param.pBTGen->SetNickName(pBTGenModule->nickname);param.pBTGen->ParamUpdate();}//識別軌跡的後處理param.pBTPP = NULL;if(pBTPostProcModule && pBTPostProcModule->create)//首先要確定非空{param.pBTPP = pBTPostProcModule->create();}if(param.pBTPP){param.pBTPP->SetNickName(pBTPostProcModule->nickname);param.pBTPP->ParamUpdate();}param.UsePPData = 0;//////////////////////////不明白這是什麼意思。//軌跡分析,官方的文檔時沒有這個模組的。param.pBTA = NULL;if(pBTAnalysisModule && pBTAnalysisModule->create){param.pBTA = pBTAnalysisModule->create();param.pBTA->SetFileName(btaName);}if(param.pBTA){param.pBTA->SetNickName(pBTAnalysisModule->nickname);param.pBTA->ParamUpdate();}pTracker = cvCreateBlobTrackerAuto1(¶m);if(!pTracker )//沒有建立成功,必須退出。{std::cout<<"pTracker 建立錯誤!"<<std::endl;return -1;}myRunBlobTrackingAuto(capture,pTracker);if(capture)cvReleaseCapture(&capture);return 0;}//main
實現的效果如下,左邊為網路攝影機採集的映像,右邊為前景的mask。: