重新改写的Blob Tracking Tests工程

来源:互联网 发布:java枚举是什么意思 编辑:程序博客网 时间:2024/05/17 03:16

虽然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。:




原创粉丝点击