From 7dca000bf947187b97330a601f7e84fa6ba2f8d5 Mon Sep 17 00:00:00 2001 From: Alex Leontiev Date: Fri, 1 Aug 2014 14:56:11 +0300 Subject: [PATCH] vadim 21 --- modules/tracking/src/tld_tracker.cpp | 25 +++++++++--------- modules/tracking/src/tld_tracker.hpp | 5 ++++ modules/tracking/src/tld_utils.cpp | 38 ++++++++++++++++++++++++---- 3 files changed, 50 insertions(+), 18 deletions(-) diff --git a/modules/tracking/src/tld_tracker.cpp b/modules/tracking/src/tld_tracker.cpp index 51371495d..dc87db0d4 100644 --- a/modules/tracking/src/tld_tracker.cpp +++ b/modules/tracking/src/tld_tracker.cpp @@ -88,14 +88,13 @@ using namespace tld; * * ?10. all in one class * -* 21. precompute offset +* -->21. precompute offset +* * 16. loops limits * 17. inner scope loops */ /* design decisions: - * blur --> resize (vs. resize-->blur) in detect(), ensembleClassifier stage - * no random gauss noise, when making examples for ensembleClassifier */ namespace cv @@ -144,7 +143,6 @@ protected: Ptr model; void computeIntegralImages(const Mat& img,Mat_& intImgP,Mat_& intImgP2){integral(img,intImgP,intImgP2,CV_64F);} inline bool patchVariance(Mat_& intImgP,Mat_& intImgP2,double originalVariance,Point pt,Size size); - inline bool ensembleClassifier(const uchar* data,int rowstep); TrackerTLD::Params params_; }; @@ -200,13 +198,15 @@ class TrackerTLDModel : public TrackerModel{ Rect2d getBoundingBox(){return boundingBox_;} void setBoudingBox(Rect2d boundingBox){boundingBox_=boundingBox;} double getOriginalVariance(){return originalVariance_;} - inline double ensembleClassifierNum(const uchar* data,int rowstep); + inline double ensembleClassifierNum(const uchar* data); + inline void prepareClassifiers(int rowstep){for(int i=0;i<(int)classifiers.size();i++)classifiers[i].prepareClassifier(rowstep);} double Sr(const Mat_& patch); double Sc(const Mat_& patch); void integrateRelabeled(Mat& img,Mat& imgBlurred,const std::vector& patches); void integrateAdditional(const std::vector >& eForModel,const std::vector >& eForEnsemble,bool isPositive); Size getMinSize(){return minSize_;} void printme(FILE* port=stdout); + protected: Size minSize_; unsigned int timeStampPositiveNext,timeStampNegativeNext; @@ -517,6 +517,7 @@ bool TLDDetector::detect(const Mat& img,const Mat& imgBlurred,Rect2d& res,std::v Mat_ intImgP,intImgP2; computeIntegralImages(resized_img,intImgP,intImgP2); + tldModel->prepareClassifiers((int)blurred_img.step[0]); for(int i=0,imax=cvFloor((0.0+resized_img.cols-initSize.width)/dx);i(dy*j,dx*i),(int)blurred_img.step[0])){ + if(!(tldModel->ensembleClassifierNum(&blurred_img.at(dy*j,dx*i))>ENSEMBLE_THRESHOLD)){ continue; } pass++; @@ -603,10 +604,10 @@ bool TLDDetector::patchVariance(Mat_& intImgP,Mat_& intImgP2,dou return ((p2-p*p)>VARIANCE_THRESHOLD*originalVariance); } -double TrackerTLDModel::ensembleClassifierNum(const uchar* data,int rowstep){ +double TrackerTLDModel::ensembleClassifierNum(const uchar* data){ double p=0; for(int k=0;k<(int)classifiers.size();k++){ - p+=classifiers[k].posteriorProbability(data,rowstep); + p+=classifiers[k].posteriorProbabilityFast(data); } p/=classifiers.size(); return p; @@ -820,9 +821,10 @@ void MyMouseCallbackDEBUG::onMouse( int event, int x, int y){ i=(int)(x/scale/dx), j=(int)(y/scale/dy); dfprintf((stderr,"patchVariance=%s\n",(detector_->patchVariance(intImgP,intImgP2,originalVariance,Point(dx*i,dy*j),initSize))?"true":"false")); - dfprintf((stderr,"p=%f\n",(tldModel->ensembleClassifierNum(&blurred_img.at(dy*j,dx*i),(int)blurred_img.step[0])))); + tldModel->prepareClassifiers((int)blurred_img.step[0]); + dfprintf((stderr,"p=%f\n",(tldModel->ensembleClassifierNum(&blurred_img.at(dy*j,dx*i))))); fprintf(stderr,"ensembleClassifier=%s\n", - (detector_->ensembleClassifier(&blurred_img.at(dy*j,dx*i),(int)blurred_img.step[0]))?"true":"false"); + (!(tldModel->ensembleClassifierNum(&blurred_img.at(dy*j,dx*i))>ENSEMBLE_THRESHOLD))?"true":"false"); resample(resized_img,Rect2d(Point(dx*i,dy*j),initSize),standardPatch); tmp=tldModel->Sr(standardPatch); @@ -859,8 +861,5 @@ void TrackerTLDModel::pushIntoModel(const Mat_& example,bool positive){ } (*proxyN)++; } -bool TLDDetector::ensembleClassifier(const uchar* data,int rowstep){ - return (((TrackerTLDModel*)static_cast(model))->ensembleClassifierNum(data,rowstep))>ENSEMBLE_THRESHOLD; -} } /* namespace cv */ diff --git a/modules/tracking/src/tld_tracker.hpp b/modules/tracking/src/tld_tracker.hpp index 9917f1a22..6ec0fc3d4 100644 --- a/modules/tracking/src/tld_tracker.hpp +++ b/modules/tracking/src/tld_tracker.hpp @@ -96,12 +96,17 @@ public: static int makeClassifiers(Size size,int measurePerClassifier,int gridSize,std::vector& classifiers); void integrate(const Mat_& patch,bool isPositive); double posteriorProbability(const uchar* data,int rowstep)const; + double posteriorProbabilityFast(const uchar* data)const; + void prepareClassifier(int rowstep); private: TLDEnsembleClassifier(std::vector meas,int beg,int end); static void stepPrefSuff(std::vector& arr,int pos,int len,int gridSize); int code(const uchar* data,int rowstep)const; + int codeFast(const uchar* data)const; std::vector posAndNeg; std::vector measurements; + std::vector offset; + int lastStep_; }; class TrackerProxy{ diff --git a/modules/tracking/src/tld_utils.cpp b/modules/tracking/src/tld_utils.cpp index c37659979..080a3acd5 100644 --- a/modules/tracking/src/tld_utils.cpp +++ b/modules/tracking/src/tld_utils.cpp @@ -268,11 +268,21 @@ void TLDEnsembleClassifier::stepPrefSuff(std::vector& arr,int pos,int len } #endif } -TLDEnsembleClassifier::TLDEnsembleClassifier(std::vector meas,int beg,int end){ - int posSize=1; - for(int i=0,mpc=end-beg;i meas,int beg,int end):lastStep_(-1){ + int posSize=1,mpc=end-beg; + for(int i=0;i& patch,bool isPositive){ int position=code(patch.data,(int)patch.step[0]); @@ -291,13 +301,31 @@ double TLDEnsembleClassifier::posteriorProbability(const uchar* data,int rowstep return posNum/(posNum+negNum); } } +double TLDEnsembleClassifier::posteriorProbabilityFast(const uchar* data)const{ + int position=codeFast(data); + double posNum=(double)posAndNeg[position].x, negNum=(double)posAndNeg[position].y; + if(posNum==0.0 && negNum==0.0){ + return 0.0; + }else{ + return posNum/(posNum+negNum); + } +} +int TLDEnsembleClassifier::codeFast(const uchar* data)const{ + int position=0; + for(int i=0;i<(int)measurements.size();i++){ + position=position<<1; + if(data[offset[i].x]