跟踪算法代码
1. 计算机视觉中,目前有哪些经典的目标跟踪算法
跟踪是一个很混乱的方向。
比如TLD、CT、Struct这些效果不错的Tracker其实都不是单纯的Tracker了。09年的时候我记得比较流行的是Particle Filtering, 或者一些MeanShift/CamShift的变形,比如特征变了,比如对问题的假设变了。
后来突然出现一些tracking by detection的方法,之前的很多朋友就觉得这是耍流氓。比如TLD,严格的跟踪算法也许只是里面的Forward/Backward Opitcal Flow的部分,但是效果很Impressive,所以不管怎样,一下就火了。
之后所谓的跟踪就不再是一个传统的跟踪问题,而是一个综合的工程问题。online learning,random projection ,sparse learning的东西都加进来,大家其实到底是在做跟踪还是在做检测或者online learning,其实已经不重要,因为衡量的标准是你在某些public dataset上的精度。
但这些对实际的项目有没有帮助呢?
这是个很有意思的地方,在很多时候,我们之所以需要跟踪算法,是因为我们的检测算法很慢,跟踪很快。基本上当前排名前几的跟踪算法都很难用在这样的情况下,因为你实际的速度已经太慢了,比如TLD,CT,还有Struct,如果目标超过十个,基本上就炸了。况且还有些跟踪算法自己drift掉了也不知道,比如第一版本的CT是无法处理drift的问题的,TLD是可以的,究其原因还是因为检测算法比较鲁棒啊……
实际中我觉得速度极快,实现也简单的纯跟踪算法居然是NCC和Overlap。
NCC很简单,这个是对点进行的,对于区域也有很多变种,网上有一些相关的资源。
Overlap是我取的名字,一般用在里面,假如你的摄像头是静止的,背景建模之后出来的前景可以是一个一个的blob,对相邻两帧的blob检测是否Overlap就可以得到track。在一些真实场景下,这个算法是非常有效的。关于背景template的问题在真实的里面也是很好解决的。
坐在电脑前面调试代码tuning 各种阈值让跟踪算法在某一个帧下面不要drift的事情我是再也不想干了。
顺祝你2015幸福快乐。
2. 运行opencv里的跟踪算法时出现了一个未定义Tracker类的问题
opencv里有个概念叫ROI,regionofinterest,比如你获得的人脸的矩形框如果是cvRectregion的话,源图像是img的话,下面的代码可以实现cvSetImageROI((IplImage*)img,region);//.size.width=region.width;size.height=region.height;m_FaceArea=cvCreateImage(size,IPL_DEPTH_8U,img->nChannels);cvCopy(img,m_FaceArea);//Copyjusttheregion.cvResetImageROI((IplImage*)img);m_FaceArea就是脸的图像了
3. 如何用c语言编写跟踪程序~~以往是用粒子滤波算法跟踪
Python break语句,就像在C语言中,打破了最小封闭for或while循环。
break语句用来终止循环语句,即循环条件没有False条件或者序列还没被完全递归完,也会停止执行循环语句。
break语句用在while和for循环中。
如果您使用嵌套循环,break语句将停止执行最深层的循环,并开始执行下一行代码。
4. 有了卡尔曼滤波跟踪算法程序代码,在matlab中如何操作才能实现对小球落地动画中的小球进行跟踪
作为一个计量学中不太常用的方法,专门介绍的书应该不多吧
在主要的计量学中应该都有涉及,梁逸增白灰黑复杂多组分分析体系及其化学计量学算法中有算法介绍,许禄的化学计量学有详细介绍还有例子,建议参考。
5. 目标检测与目标追踪源代码
大致的思路是:通过背景差或帧差的方法获取两者的差别,并通过设定阈值,将差别较大的认为是前景目标,然后通过一些腐蚀、膨胀、滤波(比如中值滤波)提取出前景目标,然后去除小目标减少干扰,并用矩形框将结果框出来,很简单,自己对照着这个思想好好看看代码吧,凡是要靠自己努力才能成长。祝学业有成~ void update_mhi( IplImage* img, IplImage* dst, int diff_threshold ) { double timestamp = clock()/1.; CvSize size = cvSize(img->width,img->height); int i, idx1, idx2; IplImage* silh; IplImage* pyr = cvCreateImage( cvSize((size.width & -2)/2, (size.height & -2)/2), 8, 1 ); CvMemStorage *stor; CvSeq *cont; /*先进行数据的初始化*/ if( !mhi || mhi->width != size.width || mhi->height != size.height ) { if( buf == 0 ) { buf = (IplImage**)malloc(N*sizeof(buf[0])); memset( buf, 0, N*sizeof(buf[0])); } for( i = 0; i < N; i++ ) { cvReleaseImage( &buf[i] ); buf[i] = cvCreateImage( size, IPL_DEPTH_8U, 1 ); cvZero( buf[i] ); } cvReleaseImage( &mhi ); mhi = cvCreateImage( size, IPL_DEPTH_32F, 1 ); cvZero( mhi ); } cvCvtColor( img, buf[last], CV_BGR2GRAY ); //前面没看,我想是将rgb图像转为灰度图像,可能create一下单通道的图像,存放转换结果的。
6. 谁有基于协方差矩阵的目标跟踪算法的代码
跟踪是一个很混乱的方向。
比如TLD、CT、Struct这些效果不错的Tracker其实都不是单纯的Tracker了。09年的时候我记得比较流行的是Particle Filtering, 或者一些MeanShift/CamShift的变形,比如特征变了,比如对问题的假设变了。
7. 图像多目标跟踪算法MATLAB代码
这个多目标是什么 车 人 还是动物之类的 这可是个大问题 一般要先检测 然后在跟踪
8. camshift或者mishift 运动目标自动跟踪的实现
camshift 实现自动化跟踪的小技巧opencv 提供了使用基于颜色的跟踪算法camshift, 很好的算法,可是它是个半自动的算法,它需要用户在跟踪界面设定跟踪的目标。怎么预先设定目标再来跟踪呢?
本人偷了个懒,加入了用一张图片来设定跟踪的目标,在启动中加载图片,生成跟踪需要的histogram。这样实现了自动化的跟踪吧。步骤如下:
1. 找到你需要跟踪的物体,拿到摄像头前,照一张相(print screen),这里需要注意的是,由于光线变化,临近摄像头会亮一些,离远会暗一些,那么最好跟踪的物体的拍摄颜色与实际跟踪中颜色相近。2. 打开画笔功能,新建一张图片(320*240),大小与视频源图像一致,把物体截取放大,这样跟踪的颜色区域就都在图像中了。 3。在代码中加入 void loadTemplateImage()
{
IplImage *tempimage = cvLoadImage("F:/OM_tracking/Test cam shift/ShadowTrack/Debug/green.bmp",1);
cvCvtColor( tempimage, hsv, CV_BGR2HSV );
int _vmin = vmin, _vmax = vmax; cvInRangeS( hsv, cvScalar(0,smin,MIN(_vmin,_vmax),0),
cvScalar(180,256,MAX(_vmin,_vmax),0), mask );
cvSplit( hsv, hue, 0, 0, 0 );
selection.x = 1;
selection.y = 1;
selection.width = 320-1;
selection.height= 240-1; cvSetImageROI( hue, selection );
cvSetImageROI( mask, selection );
cvCalcHist( &hue, hist, 0, mask ); float max_val = 0.f;
cvGetMinMaxHistValue( hist, 0, &max_val, 0, 0 );
cvConvertScale( hist->bins, hist->bins, max_val ? 255. / max_val : 0., 0 );
cvResetImageROI( hue );
cvResetImageROI( mask );
track_window = selection;
track_object = 1; cvReleaseImage(&tempimage);}4,去掉原来的生成Hist的代码。在启动时候加入loadTemplateImage5.运行代码,看结果吧. 代码这里下载