void ImRON2ParmEllipse
     (
         REAL & A,
         REAL & B,
         REAL & C,
	 const Pt2dr & aV0,
	 const Pt2dr & aV1
     )
{
   ElMatrix<REAL> aMat(2,2);
   SetCol(aMat,0,aV0);
   SetCol(aMat,1,aV1);

   aMat = gaussj(aMat);
   aMat = aMat.transpose() * aMat;

   ElMatrix<REAL> aVecP(2,2);
   ElMatrix<REAL> aValP(2,2);

   jacobi_diag(aMat,aValP,aVecP);


    aValP(0,0) = sqrt(aValP(0,0));
    aValP(1,1) = sqrt(aValP(1,1));

    ElMatrix<REAL> aABC = aVecP * aValP * aVecP.transpose();

    A = aABC(0,0);
    B = aABC(1,0);
    C = aABC(1,1);
}
bool EllipseEq2ParamPhys
     (
         REAL  & V1,
         REAL  & V2,
         REAL  & teta,
         REAL  A,
         REAL  B,
         REAL  C
     )
{
   ElMatrix<REAL> aMat(2,2);
   aMat(0,0) = A;
   aMat(1,0) = B;
   aMat(0,1) = B;
   aMat(1,1) = C;

   ElMatrix<REAL> aVecP(2,2);
   ElMatrix<REAL> aValP(2,2);

   jacobi_diag(aMat,aValP,aVecP);
   if ((aValP(0,0) <=0) || (aValP(1,1) <= 0))
       return false;
   V1 = 1 / aValP(0,0);
   V2 = 1 / aValP(1,1);
   teta = angle(Pt2dr(aVecP(0,0),aVecP(0,1)));

   if (V1 < V2)
   {
      ElSwap(V1,V2);
      teta += PI/2;
      if (teta> PI)
         teta -= PI;
   }

   return true;
}
Exemplo n.º 3
0
void cIncEnsembleCamera::OptimJacobi
     (
          std::list<cIncSetLiaison *> *  aListSL,
          const std::vector<cFonctrPond> &     aFoncAux
     )
{
    mListSl = aListSL;
    mFoncsAux = aFoncAux;
    SetOpt();
    ELISE_ASSERT(mL2Opt,"Need L2 Sys for OptimJacobi");

    mSysL2->GetMatr(mMatrL2,mMatrtB);
    jacobi_diag(mMatrL2,mMatrValP,mMatrVecP);

    mtBVecP = mMatrtB * mMatrVecP;

cElRanGen aR;
Im1D_REAL8 P0 = CurVals();
Im1D_REAL8 mImBest  = CurVals();


REAL aScInit = ScoreCur(false);
REAL aScMin = aScInit;
REAL aScAmMin = aScInit;
for (INT aTest =0 ; aTest < 100 ; aTest ++)
{
    SetPtCur(P0.data());
    Im1D_REAL8 aDir( NbVal(),0.0);
    

    for (INT aK = 0 ; aK < NbVal() ; aK++)
    {
        ELISE_ASSERT(mMatrValP(aK,aK) != 0,"Jcobi ");
        REAL Val = (mtBVecP(aK,0) /  ElAbs(mMatrValP(aK,aK)))  ;

	REAL aRan = aR.cNRrandom3()  ;

        if (aRan < 0.25)
        {
             Val = 0;
        }
        else if (aRan < 0.5)
	;
	/*
        {
             Val = Val; 
        }
	*/
        else
            Val *=  3 * aR.cNRrandom3() -1;
     

        for (INT aY =0 ; aY< NbVal() ; aY++)
            aDir.data()[aY] += mMatrVecP(aK,aY) * Val;

    }

    ELISE_COPY(aDir.all_pts(),P0.in() + aDir.in(),aDir.out());
    SetPtCur(aDir.data());
    REAL aSc = ScoreCur(false);

if (aSc < aScMin)
{
    ElSetMin(aScMin,aSc);

    for (INT aK= 0 ; aK< 10 ; aK++)
        OneItereDevL1( aK < 3);

    REAL aSc = ScoreCur(false);
    if (aSc < aScAmMin)
    {
         aScAmMin = aSc;
         ELISE_COPY(mImBest.all_pts(),CurVals().in(),mImBest.out());
    }
   
}
    cout  <<  aScMin << " " << aScInit  << " " << aSc <<  " " << aScAmMin << "\n";
}
    SetPtCur(mImBest.data());
}
Exemplo n.º 4
0
bool  cOneTestLSQ::OneLSQItere()
{
   if (!OK(Pt2dr(0,0))) return false;

   ClearStat();
   int aCpt=0;

   RMat_Inertie aMat;
   double aDif = 0;

   for(int aKx=-mNbW; aKx<=mNbW; aKx++)
   {
       for(int aKy=-mNbW; aKy<=mNbW; aKy++)
       {
          Pt2dr aP2 = mIm2->PVois(aKx,aKy);

          Pt3dr aGV2 =  mIm2->GetValDer(aP2);


           double aV1 = mValsIm1[aCpt];
          // double aV1 = mIm1.GetVal(mIm1.PVois(aKx,aKy));
          double aV2 = aGV2.z;
          double aGx = aGV2.x;
          double aGy = aGV2.y;

          aDif += ElSquare(aV1-aV2);
          aMat.add_pt_en_place(aV1,aV2);

          // Pour verifier la justesse des moindres carres
          if (0)
          {
              aV2 = 50 + 2 * aV1  - 0.5* aGx -0.25 * aGy;
          }

          mCov[IndK0][IndK0] += 1;
          mCov[IndK0][IndK1] += aV1;
          mCov[IndK0][IndKx] -= aGx;
          mCov[IndK0][IndKy] -= aGy;

          mCov[IndK1][IndK1] += aV1*aV1;
          mCov[IndK1][IndKx] -= aV1*aGx;
          mCov[IndK1][IndKy] -= aV1*aGy;

          mCov[IndKx][IndKx] += aGx*aGx;
          mCov[IndKx][IndKy] += aGx*aGy;

          mCov[IndKy][IndKy] += aGy*aGy;

          mSomI2[IndK0] += aV2;
          mSomI2[IndK1] += aV1 * aV2;
          mSomI2[IndKx] -= aV2 * aGx;
          mSomI2[IndKy] -= aV2 * aGy;

          aCpt++;
       }
   }

   for(int aK1=0; aK1<NbInc; aK1++)
   {
       mMatI2(0,aK1) = mSomI2[aK1];
       for(int aK2=0; aK2<=aK1; aK2++)
       {
           mMatCov(aK1,aK2) =  mMatCov(aK2,aK1) = mCov[aK2][aK1];
       }
   }


   jacobi_diag(mMatCov,mValP,mVecP);

   double aVPMin = 1e10;
   for(int aK1=0; aK1<NbInc; aK1++)
      aVPMin = std::min(aVPMin,mValP(aK1,aK1));

   if (aVPMin<1e-8) return false;


   mSolLSQ = gaussj(mMatCov) * mMatI2;
   mCorel0LSQ = aMat.correlation();


   mDepLSQ = Pt2dr(mSolLSQ(0,2), mSolLSQ(0,3));



   mDeps.push_back(mDepLSQ);

   return true;
}