40 #include <visp3/tt_mi/vpTemplateTrackerMIForwardAdditional.h>
42 #ifdef VISP_HAVE_OPENMP
47 :
vpTemplateTrackerMI(_warp), minimizationMethod(USE_NEWTON), evolRMS(0), x_pos(NULL), y_pos(NULL),
48 threshold_RMS(0), p_prec(), G_prec(), KQuasiNewton()
81 Warp->computeCoeff(
p);
106 ct=(int)((IW*(
Nc-1))/255.);
107 cr=(int)((Tij*(
Nc-1))/255.);
108 et=(IW*(
Nc-1))/255.-ct;
109 er=((double)Tij*(
Nc-1))/255.-cr;
113 double *tptemp=
new double[
nbParam];
114 for(
unsigned int it=0;it<
nbParam;it++)
115 tptemp[it] =
dW[0][it]*dx+
dW[1][it]*dy;
118 vpTemplateTrackerMIBSpline::PutTotPVBsplineNoSecond(
PrtTout, cr, er, ct, et,
Nc, tptemp, nbParam,
bspline);
120 vpTemplateTrackerMIBSpline::PutTotPVBspline(
PrtTout, cr, er, ct, et,
Nc, tptemp, nbParam,
bspline);
163 double MI=0,MIprec=-1000;
176 unsigned int iteration=0;
190 Warp->computeCoeff(
p);
191 #ifdef VISP_HAVE_OPENMP
192 int nthreads = omp_get_num_procs() ;
194 omp_set_num_threads(nthreads);
195 #pragma omp parallel for private(Tij,IW,i,j,i2,j2,cr,ct,er,et,dx,dy) default(shared)
221 ct=(int)((IW*(
Nc-1))/255.);
222 cr=(int)((Tij*(
Nc-1))/255.);
223 et=(IW*(
Nc-1))/255.-ct;
224 er=((double)Tij*(
Nc-1))/255.-cr;
227 erreur+=(Tij-IW)*(Tij-IW);
233 double *tptemp=
new double[
nbParam];;
234 for(
unsigned int it=0;it<
nbParam;it++)
235 tptemp[it] =(
dW[0][it]*dx+
dW[1][it]*dy);
239 vpTemplateTrackerMIBSpline::PutTotPVBsplineNoSecond(
PrtTout, cr, er, ct, et,
Nc, tptemp, nbParam,
bspline);
241 vpTemplateTrackerMIBSpline::PutTotPVBspline(
PrtTout, cr, er, ct, et,
Nc, tptemp, nbParam,
bspline);
290 switch(minimizationMethod)
296 p_test_LMA=
p-100000.1*
dp;
300 double MI_LMA=-
getCost(I,p_test_LMA);
332 s_scal_y=s_quasi.
t()*y_quasi;
336 if(std::fabs(s_scal_y) > std::numeric_limits<double>::epsilon())
337 KQuasiNewton=KQuasiNewton+0.001*(s_quasi*s_quasi.
t()/s_scal_y-KQuasiNewton*y_quasi*y_quasi.
t()*KQuasiNewton/(y_quasi.
t()*KQuasiNewton*y_quasi));
368 while( (std::fabs(MI-MIprec) > std::fabs(MI)*std::numeric_limits<double>::epsilon()) &&(iteration<
iterationMax)&&(evolRMS>threshold_RMS) );
388 x_pos=
new double[nb_corners];
389 y_pos=
new double[nb_corners];
391 Warp->computeCoeff(pw);
397 for (
unsigned int j=0; j<3; j++) {
400 Warp->computeDenom(
X1,pw);
412 Warp->computeCoeff(pw);
419 for (
unsigned int j=0; j<3; j++) {
422 Warp->computeDenom(
X1,pw);
424 evolRMS+=(x_pos[i*3+j]-
X2[0])*(x_pos[i*3+j]-
X2[0])+(y_pos[i*3+j]-
X2[1])*(y_pos[i*3+j]-
X2[1]);
429 evolRMS=evolRMS/nb_corners;
void initPosEvalRMS(const vpColVector &p)
void computeHessien(vpMatrix &H)
void getTriangle(unsigned int i, vpTemplateTrackerTriangle &T) const
unsigned int getWidth() const
void trackNoPyr(const vpImage< unsigned char > &I)
vpTemplateTrackerPoint * ptTemplate
virtual void warpX(const int &i, const int &j, double &i2, double &j2, const vpColVector &ParamM)=0
void computeOptimalBrentGain(const vpImage< unsigned char > &I, vpColVector &tp, double tMI, vpColVector &direction, double &alpha)
error that can be emited by ViSP classes.
Type getValue(double i, double j) const
vpColVector getCorner(unsigned int i) const
static void getGradYGauss2D(const vpImage< unsigned char > &I, vpImage< double > &dIy, const double *gaussianKernel, const double *gaussianDerivativeKernel, unsigned int size)
static void getGradXGauss2D(const vpImage< unsigned char > &I, vpImage< double > &dIx, const double *gaussianKernel, const double *gaussianDerivativeKernel, unsigned int size)
vpHessienApproximationType ApproxHessian
unsigned int templateSize
unsigned int iterationMax
void computeEvalRMS(const vpColVector &p)
Error that can be emited by the vpTracker class and its derivates.
double getCost(const vpImage< unsigned char > &I, const vpColVector &tp)
unsigned int getNbTriangle() const
static void filter(const vpImage< double > &I, vpImage< double > &Iu, vpImage< double > &Iv, const vpMatrix &M)
void computeMI(double &MI)
unsigned int iterationGlobale
vpMatrix HLMdesireInverse
Implementation of column vector and the associated operations.
vpMatrix inverseByLU() const
vpTemplateTrackerZone * zoneTracked
vpTemplateTrackerMIForwardAdditional()
Default constructor.
unsigned int getHeight() const
void initHessienDesired(const vpImage< unsigned char > &I)
vpTemplateTrackerWarp * Warp
static void computeHLM(const vpMatrix &H, const double &alpha, vpMatrix &HLM)
void computeProba(int &nbpoint)
virtual void dWarp(const vpColVector &X1, const vpColVector &X2, const vpColVector &ParamM, vpMatrix &dW)=0
vpHessienType hessianComputation