虽然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 WIN32
cvInitSystem(argc,argv);
#endif
//字符串的初始 化。
fgName = "myfg";
fgAviName = "fgAviName.avi";
//aviName = "video.avi";
trackName = "track.csv";
btaName = "bta.csv";
//摄像头初始化。
//capture= cvCreateCapute
if(aviName )
capture =cvCaptureFromFile(aviName);
else
capture = 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。: