void vpTemplateTrackerZNCCInverseCompositional::trackNoPyr(const vpImage<unsigned char> &I) { if(blur) vpImageFilter::filter(I, BI,fgG,taillef); //double erreur=0; vpColVector dpinv(nbParam); double Ic; double Iref; unsigned int iteration=0; int i,j; double i2,j2; initPosEvalRMS(p); do { unsigned int Nbpoint=0; //erreur=0; G=0; Warp->computeCoeff(p); double moyIref=0; double moyIc=0; for(unsigned int point=0;point<templateSize;point++) { i=ptTemplate[point].y; j=ptTemplate[point].x; X1[0]=j;X1[1]=i; Warp->computeDenom(X1,p); Warp->warpX(X1,X2,p); j2=X2[0];i2=X2[1]; if((i2>=0)&&(j2>=0)&&(i2<I.getHeight()-1)&&(j2<I.getWidth()-1)) { Iref=ptTemplate[point].val; if(!blur) Ic=I.getValue(i2,j2); else Ic=BI.getValue(i2,j2); Nbpoint++; moyIref+=Iref; moyIc+=Ic; } } if(Nbpoint > 0) { moyIref=moyIref/Nbpoint; moyIc=moyIc/Nbpoint; double sIcIref=0; double covarIref=0,covarIc=0; vpColVector sIcdIref(nbParam);sIcdIref=0; vpColVector sIrefdIref(nbParam);sIrefdIref=0; for(unsigned int point=0;point<templateSize;point++) { i=ptTemplate[point].y; j=ptTemplate[point].x; X1[0]=j;X1[1]=i; Warp->computeDenom(X1,p); Warp->warpX(X1,X2,p); j2=X2[0];i2=X2[1]; if((i2>=0)&&(j2>=0)&&(i2<I.getHeight()-1)&&(j2<I.getWidth()-1)) { Iref=ptTemplate[point].val; if(!blur) Ic=I.getValue(i2,j2); else Ic=BI.getValue(i2,j2); double prod=(Ic-moyIc); for(unsigned int it=0;it<nbParam;it++) sIcdIref[it]+=prod*(ptTemplate[point].dW[it]-moydIrefdp[it]); for(unsigned int it=0;it<nbParam;it++) sIrefdIref[it]+=(Iref-moyIref)*(ptTemplate[point].dW[it]-moydIrefdp[it]); //double er=(Iref-Ic); //erreur+=(er*er); //denom+=(Iref-moyIref)*(Iref-moyIref)*(Ic-moyIc)*(Ic-moyIc); covarIref+=(Iref-moyIref)*(Iref-moyIref); covarIc+=(Ic-moyIc)*(Ic-moyIc); sIcIref+=(Iref-moyIref)*(Ic-moyIc); } } covarIref=sqrt(covarIref); covarIc=sqrt(covarIc); double denom=covarIref*covarIc; //if(denom==0.0) if (std::fabs(denom) <= std::numeric_limits<double>::epsilon()) { diverge=true; } else { double NCC=sIcIref/denom; vpColVector dcovarIref(nbParam);dcovarIref=sIrefdIref/covarIref; G=1.*(sIcdIref/denom-NCC*dcovarIref/covarIref); try { dp=-1.*HLMdesireInverse*G; } catch(...) { std::cout<<"probleme inversion"<<std::endl; break; } Warp->getParamInverse(dp,dpinv); Warp->pRondp(p,dpinv,p); computeEvalRMS(p); } } else diverge=true; iteration++; } while( (!diverge &&(evolRMS>threshold_RMS) && (iteration < iterationMax))); //std::cout<<"erreur "<<erreur<<std::endl; nbIteration=iteration; deletePosEvalRMS(); }
void vpTemplateTrackerMIInverseCompositional::trackNoPyr(const vpImage<unsigned char> &I) { if(!CompoInitialised) std::cout<<"Compositionnal tracking no initialised\nUse InitCompInverse(vpImage<unsigned char> &I) function"<<std::endl; dW=0; if(blur) vpImageFilter::filter(I, BI,fgG,taillef); int Nbpoint=0; double lambda=lambdaDep; double MI=0,MIprec=-1000; vpColVector p_avant_estimation;p_avant_estimation=p; MI_preEstimation=-getCost(I,p); NMI_preEstimation=-getNormalizedCost(I,p); // std::cout << "MI avant: " << MI_preEstimation << std::endl; // std::cout << "NMI avant: " << NMI_preEstimation << std::endl; initPosEvalRMS(p); vpColVector dpinv(nbParam); double alpha=2.; unsigned int iteration=0; //unsigned int bspline_ = (unsigned int) bspline; //unsigned int totParam = (bspline_ * bspline_)*(1+nbParam+nbParam*nbParam); #if defined(USE_OPENMP_MI_INVCOMP) && defined(VISP_HAVE_OPENMP) int Ncb_ = (int)Ncb; int nbParam_ = (int)nbParam; int sizePrtBis = Ncb_*Ncb_; int sizedPrtBis = Ncb_*Ncb_*nbParam_; int sized2PrtBis = Ncb_*Ncb_*nbParam_*nbParam_; #endif vpMatrix Hnorm(nbParam,nbParam); do { Nbpoint=0; MIprec=MI; MI=0; #ifndef USE_OPENMP_MI_INVCOMP zeroProbabilities(); #endif Warp->computeCoeff(p); #if defined(USE_OPENMP_MI_INVCOMP) && defined(VISP_HAVE_OPENMP) #pragma omp parallel #endif { #if defined(USE_OPENMP_MI_INVCOMP) && defined(VISP_HAVE_OPENMP) double *Prtbis = new double[sizePrtBis]; double *dPrtbis = new double[sizedPrtBis]; double *d2Prtbis = new double[sized2PrtBis]; unsigned int indd, indd2; indd = indd2 = 0; for(int i=0;i<Ncb_*Ncb_;i++){ Prtbis[i]=0.0; Prt[i]=0.0; for(int j=0;j<nbParam_;j++){ dPrtbis[indd]=0.0; dPrt[indd]=0.0; indd++; for(int k=0;k<nbParam_;k++){ d2Prtbis[indd2]=0.0; d2Prt[indd2]=0.0; indd2++; } } } #pragma omp barrier #pragma omp for reduction(+:Nbpoint) #endif for(int point=0;point<(int)templateSize;point++) { vpColVector x1(2),x2(2); double i2,j2; double IW; int cr,ct; double er,et; x1[0]=(double)ptTemplate[point].x; x1[1]=(double)ptTemplate[point].y; Warp->computeDenom(x1,p); // A modif pour parallelisation mais ne pose pas de pb avec warp utilises dans DECSA Warp->warpX(x1,x2,p); j2=x2[0]; i2=x2[1]; if((i2>=0)&&(j2>=0)&&(i2<I.getHeight()-1)&&(j2<I.getWidth()-1)) { //if(m_ptCurrentMask == NULL ||(m_ptCurrentMask->getWidth() == I.getWidth() && m_ptCurrentMask->getHeight() == I.getHeight() && (*m_ptCurrentMask)[(unsigned int)i2][(unsigned int)j2] > 128)) { Nbpoint++; if(!blur) IW=(double)I.getValue(i2,j2); else IW=BI.getValue(i2,j2); ct=ptTemplateSupp[point].ct; et=ptTemplateSupp[point].et; double tmp = IW*(((double)Nc)-1.f)/255.f; cr=(int)tmp; er=tmp-(double)cr; if( (ApproxHessian==HESSIAN_NONSECOND||hessianComputation==vpTemplateTrackerMI::USE_HESSIEN_DESIRE) && (ptTemplateSelect[point] || !useTemplateSelect) ) { #if defined(USE_OPENMP_MI_INVCOMP) && defined(VISP_HAVE_OPENMP) vpTemplateTrackerMIBSpline::PutTotPVBsplineNoSecond(Prtbis, dPrtbis, cr, er, ct, et, Ncb, ptTemplate[point].dW, nbParam, bspline); #else vpTemplateTrackerMIBSpline::PutTotPVBsplineNoSecond(Prt, dPrt, cr, er, ct, et, Ncb, ptTemplate[point].dW, nbParam, bspline); #endif } else if (ptTemplateSelect[point] || !useTemplateSelect) { if(bspline==3){ #if defined(USE_OPENMP_MI_INVCOMP) && defined(VISP_HAVE_OPENMP) vpTemplateTrackerMIBSpline::PutTotPVBspline3(Prtbis, dPrtbis, d2Prtbis, cr, er, ct, et, Ncb, ptTemplate[point].dW, nbParam); #else vpTemplateTrackerMIBSpline::PutTotPVBspline3(Prt, dPrt, d2Prt, cr, er, ct, et, Ncb, ptTemplate[point].dW, nbParam); #endif // { // // ################### AY : Optim // if(et>0.5){ct++;} // if(er>0.5){cr++;} // int index = (cr*Nc+ct)*totParam; // double *ptb = &PrtTout[index]; // #endif // vpTemplateTrackerMIBSpline::PutTotPVBspline3(ptb, er, ptTemplateSupp[point].BtInit, size); // // ################### // } } else{ #if defined(USE_OPENMP_MI_INVCOMP) && defined(VISP_HAVE_OPENMP) vpTemplateTrackerMIBSpline::PutTotPVBspline4(Prtbis, dPrtbis, d2Prtbis, cr, er, ct, et, Ncb, ptTemplate[point].dW, nbParam); #else vpTemplateTrackerMIBSpline::PutTotPVBspline4(Prt, dPrt, d2Prt, cr, er, ct, et, Ncb, ptTemplate[point].dW, nbParam); #endif } } else{ #if defined(USE_OPENMP_MI_INVCOMP) && defined(VISP_HAVE_OPENMP) vpTemplateTrackerMIBSpline::PutTotPVBsplinePrt(Prtbis, cr, er, ct, et, Ncb ,nbParam, bspline); #else vpTemplateTrackerMIBSpline::PutTotPVBsplinePrt(Prt, cr, er, ct, et, Ncb,nbParam, bspline); #endif } } } } #if defined(USE_OPENMP_MI_INVCOMP) && defined(VISP_HAVE_OPENMP) #pragma omp critical { unsigned int indd, indd2; indd = indd2 = 0; for(int i=0;i<Ncb*Ncb;i++){ Prt[i]+=Prtbis[i]/(double)Nbpoint; for(int j=0;j<nbParam_;j++){ dPrt[indd]+=dPrtbis[indd]/(double)Nbpoint; indd++; for(int k=0;k<nbParam_;k++){ d2Prt[indd2]+=d2Prtbis[indd2]/(double)Nbpoint; indd2++; } } } delete [] Prtbis; delete [] dPrtbis; delete [] d2Prtbis; } #pragma omp barrier #endif } if(Nbpoint==0) { diverge=true; MI=0; deletePosEvalRMS(); throw(vpTrackingException(vpTrackingException::notEnoughPointError, "No points in the template")); } else { // computeProba(Nbpoint); #ifndef USE_OPENMP_MI_INVCOMP unsigned int indd, indd2; indd = indd2 = 0; unsigned int Ncb_ = (unsigned int)Ncb; for(unsigned int i=0;i<Ncb_*Ncb_;i++){ Prt[i]=Prt[i]/Nbpoint; for(unsigned int j=0;j<nbParam;j++){ dPrt[indd]=dPrt[indd]/Nbpoint; indd++; for(unsigned int k=0;k<nbParam;k++){ d2Prt[indd2]=d2Prt[indd2]/Nbpoint; indd2++; } } } #endif computeMI(MI); if(hessianComputation!=vpTemplateTrackerMI::USE_HESSIEN_DESIRE){ computeHessienNormalized(Hnorm); computeHessien(H); } computeGradient(); vpMatrix::computeHLM(H,lambda,HLM); try { switch(hessianComputation) { case vpTemplateTrackerMI::USE_HESSIEN_DESIRE: dp=gain*HLMdesireInverse*G; break; case vpTemplateTrackerMI::USE_HESSIEN_BEST_COND: if(HLM.cond()>HLMdesire.cond()) dp=gain*HLMdesireInverse*G; else dp=gain*0.2*HLM.inverseByLU()*G; break; default: dp=gain*0.2*HLM.inverseByLU()*G; break; } } catch(vpException &e) { //std::cerr<<"probleme inversion"<<std::endl; throw(e); } } switch(minimizationMethod) { case vpTemplateTrackerMIInverseCompositional::USE_LMA: { vpColVector dp_test_LMA(nbParam); vpColVector dpinv_test_LMA(nbParam); vpColVector p_test_LMA(nbParam); if(ApproxHessian==HESSIAN_NONSECOND) dp_test_LMA=-100000.1*dp; else dp_test_LMA=1.*dp; Warp->getParamInverse(dp_test_LMA,dpinv_test_LMA); Warp->pRondp(p,dpinv_test_LMA,p_test_LMA); MI=-getCost(I,p); double MI_LMA=-getCost(I,p_test_LMA); if(MI_LMA>MI) { dp=dp_test_LMA; lambda=(lambda/10.<1e-6)?lambda/10.:1e-6; } else { dp=0; lambda=(lambda*10.<1e6)?1e6:lambda*10.; } } break; case vpTemplateTrackerMIInverseCompositional::USE_GRADIENT: dp=-gain*0.3*G*20; break; case vpTemplateTrackerMIInverseCompositional::USE_QUASINEWTON: { double s_scal_y; if(iterationGlobale!=0) { vpColVector s_quasi=p-p_prec; vpColVector y_quasi=G-G_prec; s_scal_y=s_quasi.t()*y_quasi; //std::cout<<"mise a jour K"<<std::endl; /*if(s_scal_y!=0)//BFGS KQuasiNewton=KQuasiNewton+0.01*(-(s_quasi*y_quasi.t()*KQuasiNewton+KQuasiNewton*y_quasi*s_quasi.t())/s_scal_y+(1.+y_quasi.t()*(KQuasiNewton*y_quasi)/s_scal_y)*s_quasi*s_quasi.t()/s_scal_y);*/ //if(s_scal_y!=0)//DFP if(std::fabs(s_scal_y) > std::numeric_limits<double>::epsilon())//DFP { KQuasiNewton=KQuasiNewton+0.0001*(s_quasi*s_quasi.t()/s_scal_y-KQuasiNewton*y_quasi*y_quasi.t()*KQuasiNewton/(y_quasi.t()*KQuasiNewton*y_quasi)); //std::cout<<"mise a jour K"<<std::endl; } } dp=gain*KQuasiNewton*G; //std::cout<<KQuasiNewton<<std::endl<<std::endl; p_prec=p; G_prec=G; //p-=1.01*dp; } break; default: { if(useBrent) { alpha=2.; computeOptimalBrentGain(I,p,-MI,dp,alpha); dp=alpha*dp; } if(ApproxHessian==HESSIAN_NONSECOND) dp=-1.*dp; break; } } Warp->getParamInverse(dp,dpinv); Warp->pRondp(p,dpinv,p); iteration++; iterationGlobale++; computeEvalRMS(p); // std::cout << p.t() << std::endl; } while( (!diverge) && (std::fabs(MI-MIprec) > std::fabs(MI)*std::numeric_limits<double>::epsilon()) &&(iteration< iterationMax)&&(evolRMS>threshold_RMS) ); //while( (!diverge) && (MI!=MIprec) &&(iteration< iterationMax)&&(evolRMS>threshold_RMS) ); nbIteration=iteration; if(diverge) { if(computeCovariance){ covarianceMatrix = vpMatrix(Warp->getNbParam(),Warp->getNbParam()); covarianceMatrix = -1; MI_postEstimation = -1; NMI_postEstimation = -1; } deletePosEvalRMS(); // throw(vpTrackingException(vpTrackingException::badValue, "Tracking failed")) ; } else { MI_postEstimation=-getCost(I,p); NMI_postEstimation=-getNormalizedCost(I,p); // std::cout << "MI apres: " << MI_postEstimation << std::endl; // std::cout << "NMI apres: " << NMI_postEstimation << std::endl; if(MI_preEstimation>MI_postEstimation) { p=p_avant_estimation; MI_postEstimation = MI_preEstimation; NMI_postEstimation = NMI_preEstimation; covarianceMatrix = vpMatrix(Warp->getNbParam(),Warp->getNbParam()); covarianceMatrix = -1; } deletePosEvalRMS(); if(computeCovariance){ try{ covarianceMatrix = (-H).inverseByLU(); // covarianceMatrix = (-Hnorm).inverseByLU(); } catch(...){ covarianceMatrix = vpMatrix(Warp->getNbParam(),Warp->getNbParam()); covarianceMatrix = -1; MI_postEstimation = -1; NMI_postEstimation = -1; deletePosEvalRMS(); // throw(vpMatrixException(vpMatrixException::matrixError, "Covariance not inversible")) ; } } } }
void vpTemplateTrackerSSDInverseCompositional::trackNoPyr(const vpImage<unsigned char> &I) { double erreur=0; unsigned int Nbpoint=0; if(blur) vpImageFilter::filter(I, BI,fgG,taillef); vpColVector dpinv(nbParam); double IW; double Tij; unsigned int iteration=0; int i,j; double i2,j2; double alpha=2.; //vpTemplateTrackerPointtest *pt; initPosEvalRMS(p); vpTemplateTrackerPoint *pt; do { Nbpoint=0; erreur=0; dp=0; Warp->computeCoeff(p); for(unsigned int point=0;point<templateSize;point++) { if((!useTemplateSelect)||(ptTemplateSelect[point])) { //pt=&ptTemplatetest[point]; pt=&ptTemplate[point]; i=pt->y; j=pt->x; X1[0]=j;X1[1]=i; Warp->computeDenom(X1,p); Warp->warpX(X1,X2,p); j2=X2[0];i2=X2[1]; if((i2>=0)&&(j2>=0)&&(i2<I.getHeight()-1)&&(j2<I.getWidth()-1)) { Tij=pt->val; if(!blur) IW=I.getValue(i2,j2); else IW=BI.getValue(i2,j2); Nbpoint++; double er=(Tij-IW); for(unsigned int it=0;it<nbParam;it++) dp[it]+=er*pt->HiG[it]; erreur+=er*er; } } } //std::cout << "npoint: " << Nbpoint << std::endl; if(Nbpoint==0) { //std::cout<<"plus de point dans template suivi"<<std::endl; deletePosEvalRMS(); throw(vpTrackingException(vpTrackingException::notEnoughPointError, "No points in the template")); } dp=gain*dp; //std::cout<<erreur/Nbpoint<<","<<GetCost(I,p)<<std::endl; if(useBrent) { alpha=2.; computeOptimalBrentGain(I,p,erreur/Nbpoint,dp,alpha); dp=alpha*dp; } Warp->getParamInverse(dp,dpinv); Warp->pRondp(p,dpinv,p); iteration++; computeEvalRMS(p); //std::cout << "iteration: " << iteration << " max: " << iterationMax << std::endl; //std::cout << "evolRMS: " << evolRMS << " threshold: " << threshold_RMS << std::endl; } while(/*( erreur_prec-erreur<50) &&*/ (iteration < iterationMax)&&(evolRMS>threshold_RMS)); nbIteration=iteration; deletePosEvalRMS(); }
void vpTemplateTrackerMIForwardAdditional::trackNoPyr(const vpImage<unsigned char> &I) { dW=0; double erreur=0; int Nbpoint=0; if(blur) vpImageFilter::filter(I, BI,fgG,taillef); vpImageFilter::getGradXGauss2D(I, dIx, fgG,fgdG,taillef); vpImageFilter::getGradYGauss2D(I, dIy, fgG,fgdG,taillef); double MI=0,MIprec=-1000; MI_preEstimation=-getCost(I,p); double i2,j2; double Tij; double IW,dx,dy; //unsigned int cr,ct; double er,et; double alpha=2.; int i,j; unsigned int iteration=0; initPosEvalRMS(p); do { if(iteration%5==0) initHessienDesired(I); Nbpoint=0; MIprec=MI; MI=0; erreur=0; zeroProbabilities(); Warp->computeCoeff(p); #ifdef VISP_HAVE_OPENMP int nthreads = omp_get_num_procs() ; //std::cout << "file: " __FILE__ << " line: " << __LINE__ << " function: " << __FUNCTION__ << " nthread: " << nthreads << std::endl; omp_set_num_threads(nthreads); #pragma omp parallel for private(Tij,IW,i,j,i2,j2,cr,ct,er,et,dx,dy) default(shared) #endif for(int point=0;point<(int)templateSize;point++) { i=ptTemplate[point].y; j=ptTemplate[point].x; X1[0]=j;X1[1]=i; Warp->computeDenom(X1,p); Warp->warpX(X1,X2,p); j2=X2[0];i2=X2[1]; if((i2>=0)&&(j2>=0)&&(i2<I.getHeight()-1)&&(j2<I.getWidth()-1)) { Nbpoint++; Tij=ptTemplate[point].val; //Tij=Iterateurvecteur->val; if(!blur) IW=I.getValue(i2,j2); else IW=BI.getValue(i2,j2); dx=1.*dIx.getValue(i2,j2)*(Nc-1)/255.; dy=1.*dIy.getValue(i2,j2)*(Nc-1)/255.; ct=(int)((IW*(Nc-1))/255.); cr=(int)((Tij*(Nc-1))/255.); et=(IW*(Nc-1))/255.-ct; er=((double)Tij*(Nc-1))/255.-cr; //calcul de l'erreur erreur+=(Tij-IW)*(Tij-IW); //Calcul de l'histogramme joint par interpolation bilinÃaire (Bspline ordre 1) Warp->dWarp(X1,X2,p,dW); //double *tptemp=temp; double *tptemp=new double[nbParam];; for(unsigned int it=0;it<nbParam;it++) tptemp[it] =(dW[0][it]*dx+dW[1][it]*dy); //*tptemp++ =dW[0][it]*dIWx+dW[1][it]*dIWy; //std::cout<<cr<<" "<<ct<<" ; "; if(ApproxHessian==HESSIAN_NONSECOND||hessianComputation==vpTemplateTrackerMI::USE_HESSIEN_DESIRE) vpTemplateTrackerMIBSpline::PutTotPVBsplineNoSecond(PrtTout, cr, er, ct, et, Nc, tptemp, nbParam, bspline); else if(ApproxHessian==HESSIAN_0 || ApproxHessian==HESSIAN_NEW) vpTemplateTrackerMIBSpline::PutTotPVBspline(PrtTout, cr, er, ct, et, Nc, tptemp, nbParam, bspline); delete[] tptemp; } } if(Nbpoint==0) { //std::cout<<"plus de point dans template suivi"<<std::endl; diverge=true; MI=0; deletePosEvalRMS(); throw(vpTrackingException(vpTrackingException::notEnoughPointError, "No points in the template")); } else { computeProba(Nbpoint); computeMI(MI); //std::cout<<iteration<<"\tMI= "<<MI<<std::endl; computeHessien(H); computeGradient(); vpMatrix::computeHLM(H,lambda,HLM); try { switch(hessianComputation) { case vpTemplateTrackerMI::USE_HESSIEN_DESIRE: dp=gain*HLMdesireInverse*G; break; case vpTemplateTrackerMI::USE_HESSIEN_BEST_COND: if(HLM.cond()>HLMdesire.cond()) dp=gain*HLMdesireInverse*G; else dp=gain*0.2*HLM.inverseByLU()*G; break; default: dp=gain*0.2*HLM.inverseByLU()*G; break; } } catch(vpException &e) { //std::cerr<<"probleme inversion"<<std::endl; deletePosEvalRMS(); throw(e); } } switch(minimizationMethod) { case vpTemplateTrackerMIForwardAdditional::USE_LMA: { vpColVector p_test_LMA(nbParam); if(ApproxHessian==HESSIAN_NONSECOND) p_test_LMA=p-100000.1*dp; else p_test_LMA=p+1.*dp; MI=-getCost(I,p); double MI_LMA=-getCost(I,p_test_LMA); if(MI_LMA>MI) { p=p_test_LMA; lambda=(lambda/10.<1e-6)?lambda/10.:1e-6; } else { lambda=(lambda*10.<1e6)?1e6:lambda*10.; } } break; case vpTemplateTrackerMIForwardAdditional::USE_GRADIENT: { dp=-gain*6.0*G; if(useBrent) { alpha=2.; computeOptimalBrentGain(I,p,-MI,dp,alpha); dp=alpha*dp; } p+=1.*dp; break; } case vpTemplateTrackerMIForwardAdditional::USE_QUASINEWTON: { double s_scal_y; if(iterationGlobale!=0) { vpColVector s_quasi=p-p_prec; vpColVector y_quasi=G-G_prec; s_scal_y=s_quasi.t()*y_quasi; //if(s_scal_y!=0)//BFGS // KQuasiNewton=KQuasiNewton-(s_quasi*y_quasi.t()*KQuasiNewton+KQuasiNewton*y_quasi*s_quasi.t())/s_scal_y+(1.+y_quasi.t()*(KQuasiNewton*y_quasi)/s_scal_y)*s_quasi*s_quasi.t()/s_scal_y; //if(s_scal_y!=0)//DFP if(std::fabs(s_scal_y) > std::numeric_limits<double>::epsilon()) 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)); } dp=-KQuasiNewton*G; p_prec=p; G_prec=G; p-=1.01*dp; } break; default: { if(ApproxHessian==HESSIAN_NONSECOND) dp=-0.1*dp; if(useBrent) { alpha=2.; computeOptimalBrentGain(I,p,-MI,dp,alpha); //std::cout<<alpha<<std::endl; dp=alpha*dp; } p+=1.*dp; break; } } computeEvalRMS(p); iteration++; iterationGlobale++; } while( (std::fabs(MI-MIprec) > std::fabs(MI)*std::numeric_limits<double>::epsilon()) &&(iteration< iterationMax)&&(evolRMS>threshold_RMS) ); //while( (MI!=MIprec) &&(iteration< iterationMax)&&(evolRMS>threshold_RMS) ); if(Nbpoint==0) { //std::cout<<"plus de point dans template suivi"<<std::endl; deletePosEvalRMS(); throw(vpTrackingException(vpTrackingException::notEnoughPointError, "No points in the template")); } nbIteration=iteration; MI_postEstimation=-getCost(I,p); if(MI_preEstimation>MI_postEstimation) { MI_postEstimation = -1; } deletePosEvalRMS(); }