重新改写的Blob Tracking Tests工程

本文介绍了一个简化版的Blob追踪测试项目,旨在帮助初学者更好地理解VS框架。通过替换main函数和runblobtrackingauto函数,实现了从摄像头捕获图像并进行前景分析及显示的功能。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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




评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值