压缩感知感觉很高大上,理论分析一套一套的,本人数学水平有限,理论介绍就免了,来看看Real-Time Compressive Tracking这篇论文是怎样用压缩感知算法来进行目标跟踪的。感谢《Real-Time Compressive Tracking》的作者Kaihua Zhang、Lei Zhang、Ming-Hsuan Yang,把该论文实验所用的代码也给出来了(c++版、matlab版本应有尽有),业界良心啊,让我等小白,看完之后茅塞顿开。下面是那边论文的网页:
http://www4.comp.polyu.edu.hk/~cslzhang/CT/CT.htm
我也是在看了别人对这篇文章的介绍之后,才发现有这么好的资源,分享果然是个好东西:
http://blog.csdn.net/zouxy09/article/details/8118360
这篇博客对论文的思想和怎样运用压缩感知的工作过程有个详细的介绍。
别人都已经写过了,那我写这篇文章的意义何在呢?主要还是对自己所学知识的一个记录和总结吧,哈哈,我就从代码来看看压缩感知怎样运用于目标跟踪吧。阅读源代码,能够丰富程序设计的思路,我看的是c++版,抛开怎样读入视频或图像序列的细节不说,主要看看作者写的CompressiveTracker类。初看之下,类里面的数据函数一大堆,但真正运用的时候只要调用两个接口函数。一个是init(Mat& _frame, Rect& _objectBox),另一个是processFrame(Mat& _frame, Rect& _objectBox)。其他的函数都是为它们服务的。排版不清晰,还请见谅。接下来我干脆贴代码了:
void CompressiveTracker::init(Mat& _frame, Rect& _objectBox)
{
// compute feature template 用到了Harr特征,该函数取了featureNum种不同的harr模板组合
HaarFeature(_objectBox, featureNum);
// compute sample templates
//获取正样本图片和负样图片本用于训练
sampleRect(_frame, _objectBox, rOuterPositive, 0, 1000000, samplePositiveBox);
sampleRect(_frame, _objectBox, rSearchWindow*1.5, rOuterPositive+4.0, 100, sampleNegativeBox);
//计算积分图
integral(_frame, imageIntegral, CV_32F);
//分别计算正样本图片和负样本图片的harr特征值
getFeatureValue(imageIntegral, samplePositiveBox, samplePositiveFeatureValue);
getFeatureValue(imageIntegral, sampleNegativeBox, sampleNegativeFeatureValue);
//分别计算正样本和负样本中每个特征的平均值和标准差
classifierUpdate(samplePositiveFeatureValue, muPositive, sigmaPositive, learnRate);
classifierUpdate(sampleNegativeFeatureValue, muNegative, sigmaNegative, learnRate);
}
具体来看看init中这几个函数的作用:
void CompressiveTracker::HaarFeature(Rect& _objectBox, int _numFeature)
/*Description: compute Haar features
Arguments:
-_objectBox: [x y width height] object rectangle
-_numFeature: total number of features.The default is 50.
*/
{
//初始化features为_numFeature个包含Rect的容器
features = vector<vector<Rect>>(_numFeature, vector<Rect>());
//初始化featuresWeight为_numFeature个包含Rect权重的容器
featuresWeight = vector<vector<float>>(_numFeature, vector<float>());
int numRect;
Rect rectTemp;
float weightTemp;
for (int i=0