本文系原创,转载请注明。
有问题请留言或发邮箱:[email protected]
因为实验室项目工程的需要,最近在研究目标跟踪算法。这里提的Fast Compressive Tracking (快速压缩跟踪)算法是张开华教授在其之前的Compressive Tracking 算法(网站看这里)上做了一些简单的优化,本人测试的结果是FCT算法的处理速度在59帧/s左右(windows下),而之前的CT算法大概是29帧/s,修改后的速度还是不错的(这里的工程都是读图片帧序列,后面给出的工程资源有自带资源)。因为FCT的网站上没有给出代码的C++实现(只有MATLAB的代码,网站看这里),这里就贴出我按照其论文的意思给出C++的代码实现,这里的C++代码也是从其CT算法的c++代码上修改而来的,修改的地方我会在代码中说明。另外为了将代码能够移植到linux上,我对代码的初始运行的地方也做了修改,所以这里贴出的代码是可以运行在linux上的。代码中的注释参考了zouxy09大神的博客,最后为了方便大家运行,我会将FCT C++工程以及linux下运行的代码分别打包供大家下载。因为我也是初学者,能力有限,所以若文中有纰漏请读者指正,有问题请留言或者发我邮箱,thanks。
---------------------------------------------------------------------------------------------------
2015/1/24 补充:该版本C++代码没有实现多尺度的情况。我在看论文的时候没有仔细阅读论文(细看了CT,而没细看FCT),以为FCT论文中没有给出尺度变换的设计。后来有网友指出论文中有尺度变换,罪过罪过,很久之前的东西了,所以暂时没办法更新代码。
/************************************************************************
* File: CompressiveTracker.h
* Brief: C++ demo for paper: Kaihua Zhang, Lei Zhang, Ming-Hsuan Yang,"Real-Time Compressive Tracking," ECCV 2012.
* Version: 1.0
* Author: Yang Xian
* Email: [email protected]
* Date: 2012/08/03
* History:
* Revised by Kaihua Zhang on 14/8/2012, 23/8/2012
* Email: [email protected]
* Homepage: http://www4.comp.polyu.edu.hk/~cskhzhang/
* Project Website: http://www4.comp.polyu.edu.hk/~cslzhang/CT/CT.htm
************************************************************************/
#pragma once
#include <opencv2/core/core.hpp>
#include <opencv2/imgproc/imgproc.hpp>
#include <vector>
using std::vector;
using namespace cv;
//---------------------------------------------------
class CompressiveTracker
{
public:
CompressiveTracker(void);
~CompressiveTracker(void);
private:
int featureMinNumRect;
int featureMaxNumRect;
int featureNum;//每个box的harr特征个数(也就是弱分类器个数)
vector<vector<Rect>> features;
vector<vector<float>> featuresWeight;
int rOuterPositive;//在离上一帧跟踪到的目标位置的距离小于rOuterPositive的范围内采集 正样本
vector<Rect> samplePositiveBox;//采集的正样本box集
vector<Rect> sampleNegativeBox;//采集的负样本box集
int rSearchWindow;//扫描窗口的大小,或者说检测box的大小
Mat imageIntegral; //图像的积分图
Mat samplePositiveFeatureValue;//采集的正样本的harr特征值 ???特征值是矩阵??
Mat sampleNegativeFeatureValue;//采集的负样本的harr特征值
//对每个样本z(m维向量),它的低维表示是v(n维向量,n远小于m)。假定v中的各元素是独立分布的。
//假定在分类器H(v)中的条件概率p(vi|y=1)和p(vi|y=0)属于高斯分布,并且可以用以下四个参数来描述:
//分别是描述正负样本的高斯分布的均值u和方差sigma
vector<float> muPositive;
vector<float> sigmaPositive;
vector<float> muNegative;
vector<float> sigmaNegative;
float learnRate;//学习速率,控制分类器参数更新的步长
vector<Rect> detectBox; //需要检测的box
Mat detectFeatureValue;
RNG rng; //随机数
private:
void HaarFeature(Rect& _objectBox, int _numFeature);
void sampleRect(Mat& _image, Rect& _objectBox, float _rInner, float _rOuter, int _maxSampleNum, vector<Rect>& _sampleBox);
<span style&