Ejemplo n.º 1
0
REAL cLEqHomOneDist::AddAllEquationsToSet()
{

   mSet.AddContrainte(mDRF->StdContraintes(),true);

   for (std::vector<cHomogFormelle *>::iterator itH=mHomFs.begin();itH!=mHomFs.end() ;itH++)
   {
       mSet.AddContrainte((*itH)->StdContraintes(),true);
   }

   

   REAL Res=0,Cpt=0;
   for (INT aK=0; aK<INT(mEqFs.size()) ; aK++)
   {
        cEqHomogFormelle * pEq = mEqFs[aK];
        ElPackHomologue * pPack = mLiaisons[aK];
        
        for 
        (
           ElPackHomologue::const_iterator it= pPack->begin();
           it!= pPack->end();
           it++
        )
        {
           REAL Ecart = pEq->AddLiaisonP1P2(it->P1(),it->P2(),it->Pds(),mDerSec) ;
           Res += std::abs(Ecart);
           Cpt ++;
        }
   }


   return Res/Cpt;
}
Ejemplo n.º 2
0
template <const int TheNb> void NOMerge_AddPackHom
                           (
                                cStructMergeTieP< cFixedSizeMergeTieP<TheNb,Pt2dr> > & aMap,
                                const ElPackHomologue & aPack,
                                const ElCamera * aCam1,int aK1,
                                const ElCamera * aCam2,int aK2
                           )
{
    for
    (
          ElPackHomologue::tCstIter itH=aPack.begin();
          itH !=aPack.end();
          itH++
    )
    {
         ElCplePtsHomologues aCple = itH->ToCple();
         Pt2dr aP1 =  aCple.P1();
         Pt2dr aP2 =  aCple.P2();
         if (aCam1)
         {
             aP1 =  ProjStenope(aCam1->F2toDirRayonL3(aP1));
         }
         if (aCam2)
         {
            aP2 =  ProjStenope(aCam2->F2toDirRayonL3(aP2));
         }
         aMap.AddArc(aP1,aK1,aP2,aK2);
    }
}
Ejemplo n.º 3
0
REAL cEqFPtLiaison::AddPackLiaisonP1P2
(
     const ElPackHomologue & aPack,
     bool WithD2,
     cElStatErreur * aStat,
     REAL aPdsGlob ,
     REAL * SomPdsTot
)
{
    REAL aRes  = 0.0;
    REAL aSPds = 0.0;
    for
    (
       ElPackHomologue::const_iterator it=aPack.begin();
       it!=aPack.end();
       it++
    )
    {
       REAL aP = aPdsGlob * it->Pds();
       if (SomPdsTot)
          *SomPdsTot += aP;
       REAL Ecart = ElAbs(AddLiaisonP1P2(it->P1(),it->P2(),aP,WithD2));
       aRes += Ecart * aP;
       aSPds += aP;
       if (aStat)
          aStat->AddErreur(Ecart);
    }
        
    return aRes / aSPds;
}
Ejemplo n.º 4
0
void cEqHomogFormelle::StdRepondere(ElPackHomologue & aPack,REAL aCoeff)
{
    cElHomographie H1 = HF1().HomCur();
    cElHomographie H2 = HF2().HomCur();
    ElDistRadiale_PolynImpair Dist(1e5,Pt2dr(0,0));
    if (DRF()) 
       Dist = DRF()->DistCur();

    for
    (
         ElPackHomologue::iterator it=aPack.begin();
         it!=aPack.end();
         it++
    )
    {
          Pt2dr aP1 = it->P1();
          Pt2dr aP2 = it->P2();
          if (mDRF)
          {
              aP1 = Dist.Direct(aP1);
              aP2 = Dist.Direct(aP2);
          }
          Pt2dr Ec = H1.Direct(Dist.Direct(it->P1())) - H2.Direct(Dist.Direct(it->P2()));

          REAL D = euclid(Ec);
         
          REAL Pds = 1 / (1 + ElSquare(D/aCoeff));
          it->Pds() = Pds;
    }
}
Ejemplo n.º 5
0
double cLiaisORPO::Residu()
{
    SetOrCam();
    if (! mProfCalc)
    {
       mProfCalc = true;
       SetProf();
    }

    // ElRotation3D aC1toM = mCam1.Orientation().inv();
    // ElRotation3D aMtoC2 = mCam2.Orientation();

    ElRotation3D  aC1toC2 =  mCam2.Orient() *  mCam1.Orient().inv();

    Pt3dr aBaseInC2 = aC1toC2.ImAff(Pt3dr(0,0,0));

    ElMatrix<double> aMat =  aC1toC2.Mat() ;

    Pt3dr aC0,aC1,aC2;
    aMat.GetCol(0,aC0);
    aMat.GetCol(1,aC1);
    aMat.GetCol(2,aC2);


    double sDist=0.0;
    int aK = 0;

    for (ElPackHomologue::const_iterator itP =mPack.begin() ; itP!=mPack.end(); itP++)
    {
       double aPds = itP->Pds();
       double aLambda =  mProfs.at(aK);

        Pt2dr aPIm1 = itP->P1();
        Pt3dr aRay1 = aC0 * aPIm1.x + aC1 * aPIm1.y + aC2;


        Pt3dr aPTerA = aBaseInC2 + aRay1 * (aLambda *0.99);
        Pt3dr aPTerB = aBaseInC2 + aRay1 * (aLambda *1.01);

        Pt2dr aProjA(aPTerA.x/aPTerA.z,aPTerA.y/aPTerA.z);
        Pt2dr aProjB(aPTerB.x/aPTerB.z,aPTerB.y/aPTerB.z);

         Pt2dr aVAB  (aProjB.y-aProjA.y,aProjA.x-aProjB.x);

         double aD2 =  ElAbs(scal(aVAB,aProjA-itP->P2()) / euclid(aVAB));
         sDist += aPds*aD2;

         aK++;
    }

    if (DEBUG_POWEL)
    {
        std::cout << sDist/mPack.size() << "\n"; // getchar();
    }

    return sDist * mPPL->Pds().Val();
}
void cMA_AffineOrient::TestOri1Ori2(bool ShowAll,CamStenope & anOri1,CamStenope & anOri2)
{
   double aSEc2 =0;
   double aSEc =0;
   double aSP =0;
   for 
   (
      ElPackHomologue::iterator iT = mPack.begin();
      iT != mPack.end();
      iT++
   )
   {
          Pt2dr aQ1  = mCam1.F2toPtDirRayonL3(iT->P1());
          Pt2dr aQ2  = mCam2.F2toPtDirRayonL3(iT->P2());
          double aL =  mCpl12->ResiduSigneP1P2(aQ1,aQ2);
          aL = ElAbs(aL*mFocale);


          double aD;
          anOri1.PseudoInter(iT->P1(),anOri2,iT->P2(),&aD);
          aSEc2 += ElSquare(aD)*iT->Pds();
          aSEc  += ElAbs(aD)*iT->Pds();
          aSP   += iT->Pds();

       // double aRatio = aL/aD;
       // Pt2dr  aP1 = mGeoTer.R2ToRDisc(iT->P1());
       // Pt2di  aI1  =  round_down(aP1/mPas);
/*
          {
             if (ShowAll) std::cout  << aL << aP << "\n";
                   << iT->Pds() << " "
                   << iT->P1()  << " "
                   << iT->P2()  << " "
                   << " RATIO = " << aL/aD  << " " 
                   << " Ec Ang " <<  aL     << " "
                   << " D INTER = " << aD << "\n";
          }
*/
   }
   std::cout << "EC2 = " << sqrt(aSEc2/aSP) 
             <<  " ECAbs = " << (aSEc/aSP) << "\n";

   for 
   (
        std::list<cListTestCpleHomol>::iterator itC=mAppli.ListTestCpleHomol().begin();
        itC !=mAppli.ListTestCpleHomol().end();
        itC++
   )
   {
       // Pt2dr aP1 = itC->PtIm1();
       // Pt2dr aP2 = itC->PtIm2();
       double aD;
       Pt3dr aP = anOri1.PseudoInter(itC->PtIm1(),anOri2,itC->PtIm2(),&aD);
 
       std::cout << "VERIF " << aP << " " << aD << "\n";
   }
}
Ejemplo n.º 7
0
cElHomographie cElHomographie::RansacInitH(const ElPackHomologue & aPack,int aNbRansac,int aNbMaxPts)
{
   if ((aPack.size()<10)  || (aNbMaxPts<4))
      return cElHomographie(aPack,false);
   

   cRandNParmiQ aRand(aNbMaxPts,aPack.size());
   std::vector<ElCplePtsHomologues> aVCH;

   for (ElPackHomologue::tCstIter itH=aPack.begin() ; itH!=aPack.end() ; itH++)
   {
      if (aRand.GetNext())
      {
          aVCH.push_back(itH->ToCple());
      }
   }

   double anEcMin = 1e30;
   cElHomographie aHMin = cElHomographie::Id();

   while (aNbRansac)
   {
       int aK1 = NRrandom3(aVCH.size());
       int aK2 = NRrandom3(aVCH.size());
       int aK3 = NRrandom3(aVCH.size());
       int aK4 = NRrandom3(aVCH.size());
       if ( 
               (aK1!=aK2) && (aK1!=aK3) &&  (aK1!=aK4)
            && (aK2!=aK3) && (aK2!=aK4)
            && (aK3!=aK4)
          )
        {
            aNbRansac--;
            ElPackHomologue aP4;
            aP4.Cple_Add(aVCH[aK1]);
            aP4.Cple_Add(aVCH[aK2]);
            aP4.Cple_Add(aVCH[aK3]);
            aP4.Cple_Add(aVCH[aK4]);

            cElHomographie aSol = cElHomographie(aP4,true);
            double anEcart = 0;
            for (int aKP=0 ; aKP<int(aVCH.size()) ;  aKP++)
            {
                anEcart += euclid(aSol.Direct(aVCH[aKP].P1()),aVCH[aKP].P2());
            }
            anEcart /= aVCH.size();
            if (anEcart<anEcMin)
            {
                anEcMin = anEcart;
                aHMin = aSol;
            }
        }
   }
   std::cout << "ECART H " << anEcMin << "\n";
   return aHMin;
 
}
Ejemplo n.º 8
0
void cLiaisORPO::SetProf()
{
   mProfs.clear();
   Pt3dr aC1 = mCam1.PseudoOpticalCenter();
   for(ElPackHomologue::iterator itP=mPack.begin();itP!=mPack.end();itP++)
   {
       Pt3dr aPTer = mCam1.PseudoInter(itP->P1(),mCam2,itP->P2());
       mProfs.push_back
       (
           scal(aPTer-aC1,mCam1.F2toDirRayonR3(itP->P1()))
       );
   }
}
Ejemplo n.º 9
0
void cEqFPtLiaison::PondereFromResidu
     (ElPackHomologue & aPack,REAL Ecart,REAL anEcCoupure)
{
     for
     (
          ElPackHomologue::iterator it=aPack.begin();
          it!=aPack.end();
          it++
     )
     {
        REAL aResidu = ResiduNonSigneP1P2(it->P1(),it->P2());
        it->Pds() = 1 / (1+ElSquare(aResidu/Ecart));
        if ((anEcCoupure > 0) && (aResidu > anEcCoupure))
           it->Pds() = 0;
     }
}
Ejemplo n.º 10
0
void cCameraTiepRed::SaveHom(cCameraTiepRed* aCam2,const std::list<int> & aLBox)
{

    std::pair<CamStenope*,CamStenope*>  aPC (0,0);
    if (mAppli.VerifNM())// (this != aCam2)
    {
       aPC = mAppli.NM().CamOriRel(NameIm(),aCam2->NameIm());
    }
    CamStenope* aCS1 = aPC.first;
    CamStenope* aCS2 = aPC.second;

    ElPackHomologue aRes;
    for (std::list<int>::const_iterator itI=aLBox.begin(); itI!=aLBox.end() ; itI++)
    {
         std::string aName = mAppli.NameHomol(NameIm(),aCam2->NameIm(),*itI);

         if (ELISE_fp::exist_file(aName))
         {
             ElPackHomologue aPack = ElPackHomologue::FromFile(aName);
             aRes.Add(aPack);

             // Verif
             if (aCS2)
             {
                 std::vector<double> aVD;
                 for (ElPackHomologue::const_iterator itP=aPack.begin(); itP!=aPack.end(); itP++)
                 {
                     double aDist;
                     aCS1->PseudoInterPixPrec(itP->P1(),*aCS2,itP->P2(),aDist);
                     aVD.push_back(aDist);
                 }
                 if (aVD.size())
                     std::cout << "Verif   CamOriRel " << MedianeSup(aVD) << "\n";
             }

         }
    }

    if (aRes.size())
    {
         std::string aKeyH = "NKS-Assoc-CplIm2Hom@"+ mAppli.StrOut() + "@dat";
         std::string aNameH = mAppli.ICNM()->Assoc1To2(aKeyH,NameIm(),aCam2->NameIm(),true);
         aRes.StdPutInFile(aNameH);
         // std::string aNameH = mAppli
    }
}
Ejemplo n.º 11
0
void cOneRotPowelOptimize::InitPts()
{
    for 
    (
       std::list<cPowPointLiaisons>::const_iterator itP=mOP->PowPointLiaisons().begin();
       itP!=mOP->PowPointLiaisons().end();
       itP++
    )
    {
        std::list<cPoseCam *> aLCam = mAppli->ListCamInitAvecPtCom(itP->Id(),mCam);
    
    // Pour l'insntant la selec se fait par simple tirage aleatoire
        int aNbPtsTot = 0;
        for (std::list<cPoseCam *>::iterator itC=aLCam.begin();itC!=aLCam.end();itC++)
        {

             ElPackHomologue aPack ;
             mAppli->InitPack(itP->Id(),aPack,mCam->Name(),(*itC)->Name());
             aNbPtsTot += aPack.size();
        }

        int aNbCible = itP->NbTot();
        for (std::list<cPoseCam *>::iterator itC=aLCam.begin();itC!=aLCam.end();itC++)
        {
             mLIais.push_back(cLiaisORPO(*itP,mCam,*itC));
             ElPackHomologue aPack ;
             mAppli->InitPackPhgrm
             (
                  itP->Id(),aPack,
                  mCam->Name(),&mCam->Calib()->CamInit(),
                  (*itC)->Name(),&(*itC)->Calib()->CamInit()
             );
             for (ElPackHomologue::iterator itPt=aPack.begin(); itPt!=aPack.end() ; itPt++)
             {
                 if (NRrandom3() < double(aNbCible)/aNbPtsTot)
                 {
                     mLIais.back().Pack().Cple_Add(itPt->ToCple());
                     mNbMes++;
                     aNbCible--;
                 }
                 aNbPtsTot--;
             }
        }
    }
}
Pt3dr cMA_AffineOrient::CalcPtMoy(CamStenope & anOri1,CamStenope & anOri2)
{
   Pt3dr aSPt(0,0,0);
   double aSPds =0.0;
   for 
   (
      ElPackHomologue::iterator iT = mPack.begin();
      iT != mPack.end();
      iT++
   )
   {
          double aD;
          Pt3dr aP = anOri1.PseudoInter(iT->P1(),anOri2,iT->P2(),&aD);
          aSPds += iT->Pds();
          aSPt =  aSPt + aP * iT->Pds();
    }

    return aSPt/aSPds;
}
void  cAppli_GenPTripleOneImage::AddOnePackOneSens(cFixedMergeStruct<2,Pt2df> & aMap,cNewO_OneIm * anI1,int anIndI1,cNewO_OneIm * anI2)
{
    ElPackHomologue aPack = mNM->PackOfName(anI1->Name(),anI2->Name());

    CamStenope * aCS1 = anI1->CS();
    CamStenope * aCS2 = anI2->CS();


    for (ElPackHomologue::const_iterator itP=aPack.begin(); itP!=aPack.end() ; itP++)
    {
        Pt2dr aP1 = aCS1->F2toPtDirRayonL3(itP->P1());
        Pt2dr aP2 = aCS2->F2toPtDirRayonL3(itP->P2());
        Pt2df aQ1(aP1.x,aP1.y);
        Pt2df aQ2(aP2.x,aP2.y);
        // if (aSwap) ElSwap(aQ1,aQ2);
        aMap.AddArc(aQ1,anIndI1,aQ2,1-anIndI1);
    }

}
Ejemplo n.º 14
0
void cOneImageOfLayer::SplitLayer
     (
          cOneImageOfLayer& aL2,
          const std::string & aNameH,
          const cSplitLayer & aSL
     )
{
   ElPackHomologue aPck = ElPackHomologue::FromFile(mAppli.DC()+aNameH);
   int aLMin = ElMax(mLabMin,aL2.mLabMin);
   int aLMax = ElMin(mLabMax,aL2.mLabMax);

   for (int aLab = aLMin ; aLab<=aLMax ; aLab++)
   {
       ElPackHomologue aPackR;
       for
       (
            ElPackHomologue::iterator itP=aPck.begin();
            itP!=aPck.end();
            itP++
       )
       {
            if (
                      (LayerOfPt(itP->P1()) == aLab)
                   && (aL2.LayerOfPt(itP->P2()) == aLab)
               )
            {
                aPackR.Cple_Add(ElCplePtsHomologues(itP->P1(),itP->P2()));
            }
       }
 
       std::string aNameRed =  mAppli.DC()+ mAppli.ICNM()->Assoc1To2
                               (
                                    aSL.KeyCalHomSplit(),
                                    aNameH,
                                    ToString(aLab),
                                    true
                               );
       aPackR.StdPutInFile(aNameRed);
       // std::cout << "RRRReedd === " << aNameRed << "\n";
   }

}
bool  cModeleAnalytiqueComp::FiltragePointHomologues
      (
          const ElPackHomologue & aPackInit,
	  ElPackHomologue & aNewPack, 
	  double aTol,
	  double aFiltre
      )
{
       bool GotOut = false;
       Box2dr aBox1 = mAppli.PDV1()->BoxIm().AddTol(aTol);
       Box2dr aBox2 = mAppli.PDV2()->BoxIm().AddTol(aTol);

       Box2dr aBoxF1 = mAppli.PDV1()->BoxIm().AddTol(aFiltre);
       Box2dr aBoxF2 = mAppli.PDV2()->BoxIm().AddTol(aFiltre);

       for 
       (
          ElPackHomologue::const_iterator iT = aPackInit.begin();
          iT != aPackInit.end();
          iT++
       )
       {
          if (    ( aBoxF1.inside(iT->P1()))
	       && ( aBoxF2.inside(iT->P2()))
             )
          {

              bool thisOut = (! aBox1.inside(iT->P1()))
                          || (! aBox2.inside(iT->P2()));
              if (thisOut)
              {
                  std::cout << aBox1._p1 << aBox2._p1 << "\n";
                  std::cout << "OUT " << iT->P1() << " " << iT->P2() << " " << iT->Pds()<< "\n";
              }
              GotOut =    GotOut || thisOut;

	     aNewPack.Cple_Add(iT->ToCple());
          }
       }
       return GotOut;
}
ElMatrix<REAL> GlobMepRelCocentrique(double & anEcartMin,const ElPackHomologue & aPack, int aNbRansac,int aNbMaxPts) 
{
   aNbMaxPts = ElMin(aNbMaxPts,aPack.size());

   std::vector<Pt3dr> aVDir1;
   std::vector<Pt3dr> aVDir2;

   cRandNParmiQ aRand(aNbMaxPts,aPack.size());

   for (ElPackHomologue::tCstIter itH=aPack.begin() ; itH!=aPack.end() ; itH++)
   {
      if (aRand.GetNext())
      {
          aVDir1.push_back(vunit(PZ1(itH->P1())));
          aVDir2.push_back(vunit(PZ1(itH->P2())));
      }
   }

   ElMatrix<REAL> aRes(3,3);
   anEcartMin = 1e60;

   while (aNbRansac)
   {
       int aKA = NRrandom3(aVDir1.size());
       int aKB = NRrandom3(aVDir2.size());
       if (aKA!=aKB)
       {
          aNbRansac--;
          ElMatrix<REAL> aMat = ComplemRotation(aVDir1[aKA],aVDir1[aKB],aVDir2[aKA],aVDir2[aKB]);
          double anEc = SomEcartDist(aMat,aVDir1,aVDir2);
          if (anEc<anEcartMin)
          {
              anEcartMin = anEc;
              aRes = aMat;
          }
       }
   }
   return aRes;
}
Ejemplo n.º 17
0
void cLEqHomOneDist::PondereFromErreur(REAL aDCut)
{
   for (INT aK=0; aK<INT(mEqFs.size()) ; aK++)
   {
       cEqHomogFormelle * pEq = mEqFs[aK];
       ElPackHomologue * pPack = mLiaisons[aK];

       
       ElDistRadiale_PolynImpair aDist(1e5,Pt2dr(0,0));
       if (pEq->DRF())
          aDist = pEq->DRF()->DistCur();
       cElHomographie  aH1 = pEq->HF1().HomCur();
       cElHomographie  aH2 = pEq->HF2().HomCur();

       for
       (
           ElPackHomologue::iterator it= pPack->begin();
           it!= pPack->end();
           it++
       )
       {
           Pt2dr aQ1 = it->P1();
           Pt2dr aQ2 = it->P2();
           if (pEq->DRF())
           {
                 aQ1 = aDist.Direct(aQ1);
                 aQ2 = aDist.Direct(aQ2);
           }

           Pt2dr aP1 = aH1.Direct(aQ1);
           Pt2dr aP2 = aH2.Direct(aQ2);
           REAL aD = euclid(aP1,aP2) * mDiag;


           REAL aPds = 1 / (1+ElSquare(aD/aDCut));
           it->Pds() = aPds;
       }
   }
}
Ejemplo n.º 18
0
void cLEqHomOneDist::AddCple(const ElPackHomologue & aPack)
{
    cElHomographie aH12(aPack,true); 
    cElHomographie aH2 = aH12.Inverse();


     cHomogFormelle * aHF1 =   mSet.NewHomF(cElHomographie::Id(),cNameSpaceEqF::eHomFigee);
     cHomogFormelle * aHF2 =   mSet.NewHomF(aH2,cNameSpaceEqF::eHomLibre);


     ELISE_ASSERT(mDRF !=0,"LEqHomOneDist::AddCple");
     AddEqF(mSet.NewEqHomog(false,*aHF1,*aHF2,mDRF));

     for 
     (
        ElPackHomologue::const_iterator it= aPack.begin();
        it!= aPack.end();
        it++
     )
     {
        AddLiaisonOnTop(it->P1(),it->P2(),it->Pds());
     }
}
void cMA_AffineOrient::OneItere(bool isLast)
{
   ElRotation3D aR1 = mCamF1->RF().CurRot();
   ElRotation3D aR2 = mCamF2->RF().CurRot();

      std::cout << "TR = " << (aR2.tr()-aR1.tr())  << "\n";
      std::cout << "I = " <<   aR2.ImVect(Pt3dr(1,0,0))  << euclid(aR2.ImVect(Pt3dr(1,0,0))) << "\n";
      std::cout << "J = " <<   aR2.ImVect(Pt3dr(0,1,0))  << euclid(aR2.ImVect(Pt3dr(0,1,0))) << "\n";
      std::cout << "K = " <<   aR2.ImVect(Pt3dr(0,0,1))  << euclid(aR2.ImVect(Pt3dr(0,0,1))) << "\n";

   mSetEq.AddContrainte(mPIF->StdContraintes(),true);
   mSetEq.AddContrainte(mCamF1->RF().StdContraintes(),true);
   mSetEq.AddContrainte(mCamF2->RF().StdContraintes(),true);

   double aSEc2 =0;
   double aSEc =0;
   double aSP =0;
   int aNbP=0;
   for 
   (
      ElPackHomologue::iterator iT = mPack.begin();
      iT != mPack.end();
      iT++
   )
   {
       // double aD =  mCam1.EcartProj(iT->P1(),mCam2,iT->P2());
       Pt2dr aQ1  = mCam1.F2toPtDirRayonL3(iT->P1());
       Pt2dr aQ2  = mCam2.F2toPtDirRayonL3(iT->P2());
       //double aL =  mCpl12->ResiduSigneP1P2(aQ1,aQ2);
       double aL2 =  mCpl12->AddLiaisonP1P2(aQ1,aQ2,iT->Pds(),false);
       aSEc2 += ElSquare(aL2)*iT->Pds();
       aSEc += ElAbs(aL2)*iT->Pds();
       aSP  += iT->Pds();

       Pt2dr  aP1 = mGeoTer.R2ToRDisc(iT->P1());
       Pt2di  aI1  =  round_down(aP1/mPas);
       mTImResidu.oset(aI1,aL2*mFocale);
       mTImPds.oset(aI1,iT->Pds());

       if (iT->Pds() > 1e-5)
          aNbP++;
   }

   if (aNbP < mNbPtMin)
   {
      mAppli.MicMacErreur
      (
         eErrNbPointInEqOriRel,
         "Pas assez de point pour equation d'orientation relative",
         "Zone de recouvrement trop faible"
      );
   }


   mSetEq.SolveResetUpdate();
   // if (isLast)
   {
       std::cout 
           << aSEc2 << " " << aSP << " " << mPack.size()
           << " EQuad = " << (sqrt(aSEc2/aSP)*mFocale) 
           << " EAbs  = " << ((aSEc/aSP)*mFocale) 
           << "\n";
  } 
}
Ejemplo n.º 20
0
int HomFilterMasq_main(int argc,char ** argv)
{
    // MemoArg(argc,argv);
    MMD_InitArgcArgv(argc,argv);
    std::string  aDir,aPat,aFullDir;
    bool ExpTxt=false;
    std::string PostPlan="_Masq";
    std::string KeyCalcMasq;
    std::string KeyEquivNoMasq;
    std::string MasqGlob;
    double  aResol=10;
    bool AcceptNoMask;
    std::string aPostIn= "";
    std::string aPostOut= "MasqFiltered";



    ElInitArgMain
    (
    argc,argv,
    LArgMain()  << EAMC(aFullDir,"Full name (Dir+Pat)", eSAM_IsPatFile),
    LArgMain()
                    << EAM(PostPlan,"PostPlan",true,"Post to plan, Def : toto ->toto_Masq.tif like with SaisieMasq")
                    << EAM(MasqGlob,"GlobalMasq",true,"Global Masq to add to all image")
                    << EAM(KeyCalcMasq,"KeyCalculMasq",true,"For tuning masq per image")
                    << EAM(KeyEquivNoMasq,"KeyEquivNoMasq",true,"When given if KENM(i1)==KENM(i2), don't masq")
                    << EAM(aResol,"Resol",true,"Sub Resolution for masq storing, Def=10")
                    << EAM(AcceptNoMask,"ANM",true,"Accept no mask, def = true if MasqGlob and false else")
                    << EAM(ExpTxt,"ExpTxt",true,"Ascii format for in and out, def=false")
                    << EAM(aPostIn,"PostIn",true,"Post for Input dir Hom, Def=")
                    << EAM(aPostOut,"PostOut",true,"Post for Output dir Hom, Def=MasqFiltered")

    );

    #if (ELISE_windows)
        replace( aFullDir.begin(), aFullDir.end(), '\\', '/' );
     #endif
    SplitDirAndFile(aDir,aPat,aFullDir);
    if (EAMIsInit(&PostPlan))
    {
        CorrecNameMasq(aDir,aPat,PostPlan);
    }

    if (!EAMIsInit(&AcceptNoMask))
       AcceptNoMask = EAMIsInit(&MasqGlob);


    cInterfChantierNameManipulateur * anICNM = cInterfChantierNameManipulateur::BasicAlloc(aDir);


    Im2D_Bits<1>  aImMasqGlob(1,1);
    if (EAMIsInit(&MasqGlob))
       aImMasqGlob = GetMasqSubResol(aDir+MasqGlob,aResol);


    const std::vector<std::string> *  aVN = anICNM->Get(aPat);
    std::vector<Im2D_Bits<1> >  aVMasq;

    for (int aKN = 0 ; aKN<int(aVN->size()) ; aKN++)
    {
        std::string aNameIm = (*aVN)[aKN];
        Tiff_Im aTF = Tiff_Im::StdConvGen(aNameIm,1,false);
        Pt2di aSzG = aTF.sz();
        Pt2di aSzR (round_ni(Pt2dr(aSzG)/aResol));
        Im2D_Bits<1> aImMasq(aSzR.x,aSzR.y,1);


        std::string aNameMasq = StdPrefix(aNameIm)+PostPlan + ".tif";
        if (EAMIsInit(&KeyCalcMasq))
        {
            aNameMasq = anICNM->Assoc1To1(KeyCalcMasq,aNameIm,true);
        }

        if (ELISE_fp::exist_file(aNameMasq))
        {
            Im2D_Bits<1> aImMasqLoc = GetMasqSubResol(aDir+aNameMasq,aResol);
            ELISE_COPY(aImMasq.all_pts(),aImMasq.in() && aImMasqLoc.in(0),aImMasq.out());
        }
        else
        {
             if (!AcceptNoMask)
             {
                 std::cout << "For Im " << aNameIm << " file " << aNameMasq << " does not exist\n";
                 ELISE_ASSERT(false,"Masq not found");
             }
        }

        if (EAMIsInit(&MasqGlob))
        {

            ELISE_COPY(aImMasq.all_pts(),aImMasq.in() && aImMasqGlob.in(0),aImMasq.out());
        }

        aVMasq.push_back(aImMasq);
        // Tiff_Im::CreateFromIm(aImMasq,"SousRes"+aNameMasq);
    }

    std::string anExt = ExpTxt ? "txt" : "dat";


    std::string aKHIn =   std::string("NKS-Assoc-CplIm2Hom@")
                       +  std::string(aPostIn)
                       +  std::string("@")
                       +  std::string(anExt);
    std::string aKHOut =   std::string("NKS-Assoc-CplIm2Hom@")
                        +  std::string(aPostOut)
                        +  std::string("@")
                       +  std::string(anExt);




    for (int aKN1 = 0 ; aKN1<int(aVN->size()) ; aKN1++)
    {
        for (int aKN2 = 0 ; aKN2<int(aVN->size()) ; aKN2++)
        {
             std::string aNameIm1 = (*aVN)[aKN1];
             std::string aNameIm2 = (*aVN)[aKN2];

             std::string aNameIn = aDir + anICNM->Assoc1To2(aKHIn,aNameIm1,aNameIm2,true);

             if (ELISE_fp::exist_file(aNameIn))
             {
                  bool UseMasq = true;
                  if (EAMIsInit(&KeyEquivNoMasq))
                  {
                       UseMasq =  (anICNM->Assoc1To1(KeyEquivNoMasq,aNameIm1,true) != anICNM->Assoc1To1(KeyEquivNoMasq,aNameIm2,true) );
                  }


                  TIm2DBits<1>  aMasq1 ( aVMasq[aKN1]);
                  TIm2DBits<1>  aMasq2 ( aVMasq[aKN2]);

                  ElPackHomologue aPackIn =  ElPackHomologue::FromFile(aNameIn);
                  ElPackHomologue aPackOut;
                  for (ElPackHomologue::const_iterator itP=aPackIn.begin(); itP!=aPackIn.end() ; itP++)
                  {
                      Pt2dr aP1 = itP->P1();
                      Pt2dr aP2 = itP->P2();
                      Pt2di aQ1 = round_ni(aP1/aResol);
                      Pt2di aQ2 = round_ni(aP2/aResol);

                      if ((aMasq1.get(aQ1,0) && aMasq2.get(aQ2,0)) || (! UseMasq))
                      {
                          ElCplePtsHomologues aCple(aP1,aP2);
                          aPackOut.Cple_Add(aCple);
                      }
                  }
                  std::string aNameOut = aDir + anICNM->Assoc1To2(aKHOut,aNameIm1,aNameIm2,true);
                  aPackOut.StdPutInFile(aNameOut);
                  std::cout << "IN " << aNameIn << " " << aNameOut  << " UseM " << UseMasq << "\n";
             }
        }
    }
    // std::vector<cImFMasq *> mVIm;



   return 0;
}
Ejemplo n.º 21
0
void cApply_CreateEpip_main::DoEpipGen()
{
      mLengthMin = 500.0;
      mStepReech = 10.0;
      mNbZ       = 1;
      mNbXY      = 100;
      ElPackHomologue aPack;
      Pt2dr aDir2 =  DirEpipIm2(mGenI1,mGenI2,aPack,true);
      Pt2dr aDir1 =  DirEpipIm2(mGenI2,mGenI1,aPack,false);

      std::cout << "Compute Epip\n";
      CpleEpipolaireCoord * aCple = CpleEpipolaireCoord::PolynomialFromHomologue(false,aPack,mDegre,aDir1,aDir2);

      EpipolaireCoordinate & e1 = aCple->EPI1();
      EpipolaireCoordinate & e2 = aCple->EPI2();

      Pt2dr aInf1(1e20,1e20),aSup1(-1e20,-1e20);
      Pt2dr aInf2(1e20,1e20),aSup2(-1e20,-1e20);

      double aErrMax = 0.0;
      double aErrMoy = 0.0;
      int    mNbP = 0;
      double aX2mX1 = 0.0;

      CpleEpipolaireCoord * aCple3 = 0;
      CpleEpipolaireCoord * aCple7 = 0;
      if (0)
      {
         aCple3 = CpleEpipolaireCoord::PolynomialFromHomologue(false,aPack,3,aDir1,aDir2);
         aCple7 = CpleEpipolaireCoord::PolynomialFromHomologue(false,aPack,7,aDir1,aDir2);
      }

      double aErrMaxDir1 = 0.0;
      double aErrMaxInv1 = 0.0;

      for (ElPackHomologue::const_iterator itC=aPack.begin() ; itC!= aPack.end() ; itC++)
      {
           Pt2dr aP1 = e1.Direct(itC->P1());
           Pt2dr aP2 = e2.Direct(itC->P2());
           aInf1 = Inf(aInf1,aP1);
           aSup1 = Sup(aSup1,aP1);
           aInf2 = Inf(aInf2,aP2);
           aSup2 = Sup(aSup2,aP2);

           aX2mX1 += aP2.x - aP1.x;

           double anErr = ElAbs(aP1.y-aP2.y);
           mNbP++;
           aErrMax = ElMax(anErr,aErrMax);
           aErrMoy += anErr;

           if (aCple3)
           {
               Pt2dr aQ1D3 = aCple3->EPI1().Direct(itC->P1());
               Pt2dr aQ1D7 = aCple7->EPI1().Direct(itC->P1());
               double aDQ1 = euclid(aQ1D3-aQ1D7);
               aErrMaxDir1 = ElMax(aDQ1,aErrMaxDir1);

               Pt2dr aR1D3 =  aCple3->EPI1().Inverse(aQ1D3);
               Pt2dr aR1D7 =  aCple7->EPI1().Inverse(aQ1D7);
               double aDR1 = euclid(aR1D3-aR1D7);
               aErrMaxInv1 = ElMax(aDR1,aErrMaxInv1);

           }

      }
      if (aCple3)
      {
         std::cout << "MAX ER " << aErrMaxDir1 << " " << aErrMaxInv1 << "\n";
      }

      aX2mX1 /= mNbP;

      double aInfY = ElMax(aInf1.y,aInf2.y);
      double aSupY = ElMax(aSup1.y,aSup2.y);
      aInf1.y = aInf2.y = aInfY;
      aSup1.y = aSup2.y = aSupY;

      std::cout << aInf1 << " " <<  aSup1 << "\n";
      std::cout << aInf2 << " " <<  aSup2 << "\n";
      std::cout << "DIR " << aDir1 << " " << aDir2 << " X2-X1 " << aX2mX1<< "\n";
      std::cout << "Epip Rect Accuracy, Moy " << aErrMoy/mNbP << " Max " << aErrMax << "\n";


      cTmpReechEpip aReech1(true,mName1,Box2dr(Pt2dr(0,0),Pt2dr(mGenI1->SzBasicCapt3D())),&e1,Box2dr(aInf1,aSup1),mStepReech,"ImEpi1"+mPostIm+".tif",mPostMasq,mNumKer,mDebug);
      std::cout << "DONE IM1 \n";
      cTmpReechEpip aReech2(true,mName2,Box2dr(Pt2dr(0,0),Pt2dr(mGenI2->SzBasicCapt3D())),&e2,Box2dr(aInf2,aSup2),mStepReech,"ImEpi2"+mPostIm+".tif",mPostMasq,mNumKer,mDebug);
      std::cout << "DONE IM2 \n";

      std::cout << "DONNE REECH TMP \n";

//  ::cTmpReechEpip(cBasicGeomCap3D * aGeom,EpipolaireCoordinate * anEpi,Box2dr aBox,double aStep) :
}
Ejemplo n.º 22
0
int HomFilterMasq_main(int argc,char ** argv)
{
    // MemoArg(argc,argv);
    MMD_InitArgcArgv(argc,argv);
    std::string  aDir,aPat,aFullDir;
    bool ExpTxt=false;
    std::string PostPlan="_Masq";
    std::string KeyCalcMasq;
    std::string KeyEquivNoMasq;
    std::string MasqGlob;
    double  aResol=10;
    bool AcceptNoMask;
    std::string aPostIn= "";
    std::string aPostOut= "MasqFiltered";
    std::string aOriMasq3D,aNameMasq3D;
    cMasqBin3D * aMasq3D = 0;

    Pt2dr  aSelecTer;


    ElInitArgMain
    (
        argc,argv,
        LArgMain()  << EAMC(aFullDir,"Full name (Dir+Pat)", eSAM_IsPatFile),
        LArgMain()
                    << EAM(PostPlan,"PostPlan",true,"Post to plan, Def : toto ->toto_Masq.tif like with SaisieMasq")
                    << EAM(MasqGlob,"GlobalMasq",true,"Global Masq to add to all image")
                    << EAM(KeyCalcMasq,"KeyCalculMasq",true,"For tuning masq per image")
                    << EAM(KeyEquivNoMasq,"KeyEquivNoMasq",true,"When given if KENM(i1)==KENM(i2), don't masq")
                    << EAM(aResol,"Resol",true,"Sub Resolution for masq storing, Def=10")
                    << EAM(AcceptNoMask,"ANM",true,"Accept no mask, def = true if MasqGlob and false else")
                    << EAM(ExpTxt,"ExpTxt",true,"Ascii format for in and out, def=false")
                    << EAM(aPostIn,"PostIn",true,"Post for Input dir Hom, Def=")
                    << EAM(aPostOut,"PostOut",true,"Post for Output dir Hom, Def=MasqFiltered")
                    << EAM(aOriMasq3D,"OriMasq3D",true,"Orientation for Masq 3D")
                    << EAM(aNameMasq3D,"Masq3D",true,"File of Masq3D, Def=AperiCloud_${OriMasq3D}.ply")
                    << EAM(aSelecTer,"SelecTer",true,"[Per,Prop] Period of tiling on ground selection, Prop=proporion of selected")
    );
    bool aHasOri3D =  EAMIsInit(&aOriMasq3D);
    bool HasTerSelec = EAMIsInit(&aSelecTer);


    #if (ELISE_windows)
        replace( aFullDir.begin(), aFullDir.end(), '\\', '/' );
     #endif
    SplitDirAndFile(aDir,aPat,aFullDir);
    if (EAMIsInit(&PostPlan))
    {
        CorrecNameMasq(aDir,aPat,PostPlan);
    }

    if (!EAMIsInit(&AcceptNoMask))
       AcceptNoMask = EAMIsInit(&MasqGlob) || aHasOri3D;


    cInterfChantierNameManipulateur * anICNM = cInterfChantierNameManipulateur::BasicAlloc(aDir);

    std::string aKeyOri;
    if (aHasOri3D)
    {
        anICNM->CorrecNameOrient(aOriMasq3D);
        if (! EAMIsInit(&aNameMasq3D))
        {
              aNameMasq3D = aDir + "AperiCloud_" + aOriMasq3D + "_polyg3d.xml";
        }
        if (ELISE_fp::exist_file(aDir+aNameMasq3D))
        {
            aMasq3D = cMasqBin3D::FromSaisieMasq3d(aDir+aNameMasq3D);
        }
        else
        {
            ELISE_ASSERT(EAMIsInit(&aSelecTer),"Unused OriMasq3D");
        }
        aKeyOri = "NKS-Assoc-Im2Orient@" + aOriMasq3D;
    }

    Im2D_Bits<1>  aImMasqGlob(1,1);
    if (EAMIsInit(&MasqGlob))
       aImMasqGlob = GetMasqSubResol(aDir+MasqGlob,aResol);


    const std::vector<std::string> *  aVN = anICNM->Get(aPat);
    std::vector<Im2D_Bits<1> >  aVMasq;

     std::vector<CamStenope *> aVCam;


    double aResolMoy = 0;

    for (int aKN = 0 ; aKN<int(aVN->size()) ; aKN++)
    {
        std::string aNameIm = (*aVN)[aKN];
        Tiff_Im aTF = Tiff_Im::StdConvGen(aNameIm,1,false);
        Pt2di aSzG = aTF.sz();
        Pt2di aSzR (round_ni(Pt2dr(aSzG)/aResol));
        Im2D_Bits<1> aImMasq(aSzR.x,aSzR.y,1);


        std::string aNameMasq = StdPrefix(aNameIm)+PostPlan + ".tif";
        if (EAMIsInit(&KeyCalcMasq))
        {
            aNameMasq = anICNM->Assoc1To1(KeyCalcMasq,aNameIm,true);
        }

        if (ELISE_fp::exist_file(aNameMasq))
        {
            Im2D_Bits<1> aImMasqLoc = GetMasqSubResol(aDir+aNameMasq,aResol);
            ELISE_COPY(aImMasq.all_pts(),aImMasq.in() && aImMasqLoc.in(0),aImMasq.out());
        }
        else
        {
             if (!AcceptNoMask)
             {
                 std::cout << "For Im " << aNameIm << " file " << aNameMasq << " does not exist\n";
                 ELISE_ASSERT(false,"Masq not found");
             }
        }

        if (EAMIsInit(&MasqGlob))
        {

            ELISE_COPY(aImMasq.all_pts(),aImMasq.in() && aImMasqGlob.in(0),aImMasq.out());
        }

        aVMasq.push_back(aImMasq);
        // Tiff_Im::CreateFromIm(aImMasq,"SousRes"+aNameMasq);
        if (aHasOri3D)
        {
            aVCam.push_back(anICNM->StdCamOfNames(aNameIm,aOriMasq3D));
            aResolMoy += aVCam.back()->GlobResol();
        }
    }
    if (aHasOri3D)
       aResolMoy /= aVCam.size();

    std::string anExt = ExpTxt ? "txt" : "dat";


    std::string aKHIn =   std::string("NKS-Assoc-CplIm2Hom@")
                       +  std::string(aPostIn)
                       +  std::string("@")
                       +  std::string(anExt);
    std::string aKHOut =   std::string("NKS-Assoc-CplIm2Hom@")
                        +  std::string(aPostOut)
                        +  std::string("@")
                       +  std::string(anExt);


    double aPeriodTer=0,aSeuilDistTer=0;
    if (HasTerSelec)
    {
       aPeriodTer = aSelecTer.x * aResolMoy;
       aSeuilDistTer = aPeriodTer * sqrt(aSelecTer.y);
    }

    double aNbInTer=0;
    double aNbTestTer=0;


    for (int aKN1 = 0 ; aKN1<int(aVN->size()) ; aKN1++)
    {
        for (int aKN2 = 0 ; aKN2<int(aVN->size()) ; aKN2++)
        {
             std::string aNameIm1 = (*aVN)[aKN1];
             std::string aNameIm2 = (*aVN)[aKN2];

             std::string aNameIn = aDir + anICNM->Assoc1To2(aKHIn,aNameIm1,aNameIm2,true);

             if (ELISE_fp::exist_file(aNameIn))
             {
                  bool UseMasq = true;
                  if (EAMIsInit(&KeyEquivNoMasq))
                  {
                       UseMasq =  (anICNM->Assoc1To1(KeyEquivNoMasq,aNameIm1,true) != anICNM->Assoc1To1(KeyEquivNoMasq,aNameIm2,true) );
                  }


                  TIm2DBits<1>  aMasq1 ( aVMasq[aKN1]);
                  TIm2DBits<1>  aMasq2 ( aVMasq[aKN2]);

                  ElPackHomologue aPackIn =  ElPackHomologue::FromFile(aNameIn);
                  ElPackHomologue aPackOut;
                  for (ElPackHomologue::const_iterator itP=aPackIn.begin(); itP!=aPackIn.end() ; itP++)
                  {
                      Pt2dr aP1 = itP->P1();
                      Pt2dr aP2 = itP->P2();
                      Pt2di aQ1 = round_ni(aP1/aResol);
                      Pt2di aQ2 = round_ni(aP2/aResol);

                      bool Ok = ((aMasq1.get(aQ1,0) && aMasq2.get(aQ2,0)) || (! UseMasq));

                      if (Ok &&  aHasOri3D)
                      {
                          Pt3dr  aPTer= aVCam[aKN1]->PseudoInter(aP1,*(aVCam[aKN2]),aP2);
                          if (aMasq3D && (! aMasq3D->IsInMasq(aPTer)))
                             Ok = false;

                          if (Ok && HasTerSelec)
                          {
                              bool OkTer =  (mod_real(aPTer.x,aPeriodTer) < aSeuilDistTer) && (mod_real(aPTer.y,aPeriodTer) < aSeuilDistTer);
                              Ok = OkTer;
                              aNbTestTer ++;
                              aNbInTer += OkTer;
                          }
                      }  

                      if (Ok)
                      {
                          ElCplePtsHomologues aCple(aP1,aP2);
                          aPackOut.Cple_Add(aCple);
                      }
                  }
                  std::string aNameOut = aDir + anICNM->Assoc1To2(aKHOut,aNameIm1,aNameIm2,true);
                  aPackOut.StdPutInFile(aNameOut);
                  std::cout << "IN " << aNameIn << " " << aNameOut  << " UseM " << UseMasq << "\n";
             }
        }
    }
    // std::vector<cImFMasq *> mVIm;

    if (HasTerSelec)
    {
        std::cout << "A Posteriori Prop=" << aNbInTer / aNbTestTer << "\n";
    }



   return EXIT_SUCCESS;
}
Ejemplo n.º 23
0
int HomFusionPDVUnik_main(int argc,char ** argv)
{
    MMD_InitArgcArgv(argc,argv);
    std::string  aDir,aPat,aFullDir;
    std::string aPostIn= "";
    std::string aPostOut= "MasqFusion";
    bool ExpTxt=false;

    std::string aDir2;
    std::vector<std::string > aDirN;

    ElInitArgMain
    (
        argc,argv,
        LArgMain()  << EAMC(aFullDir,"Full name (Dir+Pat)", eSAM_IsPatFile)
                    << EAMC(aDir2,"Dir of external point", eSAM_IsPatFile),
        LArgMain()  
                    << EAM(aPostIn,"PostIn",true,"Post for Input dir Hom, Def=")
                    << EAM(aPostOut,"PostOut",true,"Post for Output dir Hom, Def=MasqFusion")
                    << EAM(ExpTxt,"ExpTxt",true,"Ascii format for in and out, def=false")
                    << EAM(aDirN,"DirN",true,"Supplementary dirs 2 merge")
    );

    #if (ELISE_windows)
        replace( aFullDir.begin(), aFullDir.end(), '\\', '/' );
     #endif
    cElemAppliSetFile anEASF(aFullDir);

    cInterfChantierNameManipulateur * anICNM = anEASF.mICNM;


    const std::vector<std::string> *  aVN = anEASF.SetIm();


    std::string anExt = ExpTxt ? "txt" : "dat";
    std::string aKHIn =   std::string("NKS-Assoc-CplIm2Hom@")
                       +  std::string(aPostIn)
                       +  std::string("@")
                       +  std::string(anExt);
    std::string aKHOut =   std::string("NKS-Assoc-CplIm2Hom@")
                        +  std::string(aPostOut)
                        +  std::string("@")
                       +  std::string(anExt);


    aDirN.push_back(aDir);
    aDirN.push_back(aDir2);

    for (int aKN1 = 0 ; aKN1<int(aVN->size()) ; aKN1++)
    {
        for (int aKN2 = 0 ; aKN2<int(aVN->size()) ; aKN2++)
        {
             std::string aNameIm1 = (*aVN)[aKN1];
             std::string aNameIm2 = (*aVN)[aKN2];
             std::string aNameLocIn = aDir + anICNM->Assoc1To2(aKHIn,aNameIm1,aNameIm2,true);
             ElPackHomologue aPackOut;
             int aNbH=0;

             for (int aKP=0 ; aKP<int(aDirN.size()) ; aKP++)
             {
                 std::string aNameIn=  aDirN[aKP] + aNameLocIn;
                 if (ELISE_fp::exist_file(aNameIn))
                 {
                     ElPackHomologue aPackIn =  ElPackHomologue::FromFile(aNameIn);
                     aNbH++;
                     for (ElPackHomologue::const_iterator itP=aPackIn.begin() ; itP!=aPackIn.end() ; itP++)
                     {
                         aPackOut.Cple_Add(itP->ToCple());
                     }
                 }
             }
             if (aPackOut.size() !=0)
             {
                std::string aNameOut = aDir + anICNM->Assoc1To2(aKHOut,aNameIm1,aNameIm2,true);
                aPackOut.StdPutInFile(aNameOut);
                if (0)
                   std::cout << "aNbH " << aNbH << "\n";
             }
        }
    }

    return EXIT_SUCCESS;
}
int  Luc_test_ptshom_main(int argc,char ** argv)
{
  //=====================  PARAMETRES EN DUR ==============

   std::string aDir = "C:/Users/Luc Girod/Desktop/TFE/Vignettage/vignette_sift3/";
   std::string aPatIm = ".*NEF";
   std::string Prefix = "";
   // std::string Prefix =  "_SRes" ;
   std::string Extension = "dat";

  //=====================

    // Permet de manipuler les ensemble de nom de fichier
    cInterfChantierNameManipulateur * aICNM = cInterfChantierNameManipulateur::BasicAlloc(aDir);
    const std::vector<std::string> * aSetIm = aICNM->Get(aPatIm);

//On parcourt toutes les paires d'images différentes (->testé dans le if)
    for (int aK1=0 ; aK1<int(aSetIm->size()) ; aK1++)
    {
        cout<<(*aSetIm)[aK1]<<endl;
        for (int aK2=0 ; aK2<int(aSetIm->size()) ; aK2++)
        {
            if (aK1!=aK2)
            {
               std::string aNamePack =  aDir +  aICNM->Assoc1To2
                                        (
                                           "NKS-Assoc-CplIm2Hom@"+ Prefix + "@"+Extension,
                                           (*aSetIm)[aK1],
                                           (*aSetIm)[aK2],
                                           true
                                    );

               if (aK1==0)
               {
                   bool Exist = ELISE_fp::exist_file(aNamePack);
                   if (Exist)
                   {
                      ElPackHomologue aPack = ElPackHomologue::FromFile(aNamePack);
                      if (aK2==1)
                      {
                           int aNb=0;
                           for
                           (
                               ElPackHomologue::const_iterator itP=aPack.begin();
                               itP!=aPack.end();
                               itP++
                           )
                           {
                              if (aNb<10)
                                  std::cout  << itP->P1() << itP->P2() <<"\n";
                              aNb++;
                           }
                      }
                      std::cout << aNamePack  << " " << aPack.size() << "\n";
                   }
                   else
                      std::cout  << "     # NO PACK FOR  : " << aNamePack  << "\n";
               }
            }
        }
    }


    return 0;
}
Ejemplo n.º 25
0
void cAppliApero::ExportMesuresFromCarteProf
     (
          const cExportMesuresFromCarteProf & anEM,
          const cCartes2Export &              aC,
          cElNuage3DMaille *                  aNuage,
          const ElPackHomologue &             aPackH,
          cPoseCam *                          aPose2Compl,
          const std::string &                 aNameCarte
     )
{
   if (aNameCarte == aPose2Compl->Name())
      return;
   if (  
           (! anEM.KeyAssocLiaisons12().IsInit())
        && (! anEM.KeyAssocLiaisons21().IsInit())
      )
  {
     return;
  }

  cPoseCam * aPoseCarte = PoseFromName(aNameCarte);
  const CamStenope * aCSC = aPoseCarte->CurCam();
  Pt2di aSzIm = aCSC->Sz();

  ElPackHomologue aNewPack;

  for 
  (
       ElPackHomologue::const_iterator itH=aPackH.begin();
       itH!=aPackH.end();
       itH++
  )
  {
      Pt2dr aI1 = aNuage->Plani2Index(itH->P1());
      if (aNuage->IndexHasContenuForInterpol(aI1))
      {
          Pt3dr aPTer = aNuage->PtOfIndexInterpol(aI1);
          Pt2dr aP1 = aCSC->R3toF2(aPTer);
          if ((aP1.x>0) && (aP1.y>0) && (aP1.x<aSzIm.x) && (aP1.y<aSzIm.y))
          {
              aNewPack.Cple_Add(ElCplePtsHomologues(aP1,itH->P2()));
          }
      }
  }

  if (anEM.KeyAssocLiaisons12().IsInit())
  {
     std::string aName =    mDC  
                          + mICNM->Assoc1To2
                            (
                                anEM.KeyAssocLiaisons12().Val(),
                                aNameCarte,
                                aPose2Compl->Name(),
                                true
                            );
     if (anEM.LiaisonModeAdd().Val())
        aNewPack.StdAddInFile(aName);
     else
        aNewPack.StdPutInFile(aName);
  }

  if (anEM.KeyAssocLiaisons21().IsInit())
  {
     std::string aName =    mDC  
                          + mICNM->Assoc1To2
                            (
                                anEM.KeyAssocLiaisons21().Val(),
                                aPose2Compl->Name(),
                                aNameCarte,
                                true
                            );
     aNewPack.SelfSwap();
     if (anEM.LiaisonModeAdd().Val())
        aNewPack.StdAddInFile(aName);
     else
        aNewPack.StdPutInFile(aName);
  }




}
Ejemplo n.º 26
0
void cAppliApero::ExportMesuresFromCarteProf
     (
          const cExportMesuresFromCarteProf & anEM,
          const cCartes2Export &              aC
     )
{
    for (std::list<std::string>::const_iterator itIm1= aC.Im1().begin() ; itIm1!=aC.Im1().end() ; itIm1++)
    {
       cElRegex anAutom(aC.FilterIm2().Val(),10);
       std::string aNameN = mDC+mICNM->StdCorrect(aC.Nuage(),*itIm1,true);
       cElNuage3DMaille * aNuage = cElNuage3DMaille::FromFileIm(aNameN);
       cObsLiaisonMultiple* aPackM = PackMulOfIndAndNale(anEM.IdBdLiaisonIn(),*itIm1);

       const std::vector<cOneElemLiaisonMultiple *>  & aVELM = aPackM->VPoses();
       for (int aKP=0 ; aKP<int(aVELM.size()) ; aKP++)
       {
          cPoseCam * aPose2Compl = aVELM[aKP]->Pose();
          ElPackHomologue aPackH;
       
          if (anAutom.Match(aPose2Compl->Name())
              && aPackM->InitPack(aPackH,aPose2Compl->Name())
             )
          {
             for 
             (
                std::list<std::string>::const_iterator itS=aC.ImN().begin(); 
                itS!=aC.ImN().end(); 
                itS++
             )
             {
                if (*itS != *itIm1)
                {
                    ExportMesuresFromCarteProf (anEM,aC,aNuage,aPackH,aPose2Compl,*itS);
                }
             }
             if (anEM.KeyAssocAppuis().IsInit())
             {
                 cListeAppuis1Im aXmlApp; 
                 std::string aNameRes = mDC+mICNM->Assoc1To2(anEM.KeyAssocAppuis().Val(),aPose2Compl->Name(),*itIm1,true);
                 if (anEM.AppuisModeAdd().Val())
                 {
                     if (ELISE_fp::exist_file(aNameRes))
                     {
                        aXmlApp=StdGetObjFromFile<cListeAppuis1Im>
                             (
                                 aNameRes,
                                 StdGetFileXMLSpec("ParamChantierPhotogram.xml"),
                                 "ListeAppuis1Im",
                                 "ListeAppuis1Im"
                             );
                     }
                 }
                 aXmlApp.NameImage().SetVal(aPose2Compl->Name());
                 for 
                 (
                      ElPackHomologue::const_iterator itH=aPackH.begin();
                      itH!=aPackH.end();
                      itH++
                 )
                 {
                    Pt2dr aI1 = aNuage->Plani2Index(itH->P1());
                    if (aNuage->IndexHasContenuForInterpol(aI1))
                    {
                       cMesureAppuis aMA;
                       aMA.Im() = itH->P2();
                       aMA.Ter() = aNuage->PtOfIndexInterpol(aI1);
                       aXmlApp.Mesures().push_back(aMA);
                    }
                 }
                 MakeFileXML<cListeAppuis1Im>(aXmlApp, aNameRes);

             }
          }
       }

       delete aNuage;
    }
}
Ejemplo n.º 27
0
static cElComposHomographie   ComputeHomFromHomologues
                              (
                                  const ElPackHomologue & aPack,
                                  bool aL2,
                                  cElComposHomographie& aHX,
                                  cElComposHomographie& aHY,
                                  cElComposHomographie& aHZ
                               )
{
     ElPackHomologue::const_iterator anIt=aPack.begin();
     // 0 Point : identite 
     if (aPack.size() ==0)
     {
        aHX = cElComposHomographie(1,0,0);
        aHY = cElComposHomographie(0,1,0);
        aHZ = cElComposHomographie(0,0,1);

        return  aHX;
     }


 // 1 Point : translation 
     Pt2dr P1 =  anIt->P1();
     Pt2dr P2 =  anIt->P2();
     anIt++;

     if (aPack.size() ==1)
     {
        Pt2dr aTr = P2 - P1;
        aHX = cElComposHomographie(1,0,aTr.x);
        aHY = cElComposHomographie(0,1,aTr.y);
        aHZ = cElComposHomographie(0,0,1);

        return  aHX;
     }

 // 2 Point : Similitude 
     Pt2dr Q1 =  anIt->P1();
     Pt2dr Q2 =  anIt->P2();
     anIt++;

     if (aPack.size() ==2)
     {

        Pt2dr W = (Q2-P2) / (Q1-P1);
        Pt2dr aTr = P2 - W* P1;

        aHX = cElComposHomographie(W.x,-W.y,aTr.x);
        aHY = cElComposHomographie(W.y,W.x,aTr.y);
        aHZ = cElComposHomographie(0,0,1);

        return  aHX;
     }

 // 3 Point : Affinite 
     Pt2dr R1 =  anIt->P1();
     Pt2dr R2 =  anIt->P2();
     anIt++;

     if (aPack.size() ==3)
     {
        ElMatrix<REAL> M1(2,2); SetCol(M1,0,Q1-P1); SetCol(M1,1,R1-P1);
        ElMatrix<REAL> M2(2,2); SetCol(M2,0,Q2-P2); SetCol(M2,1,R2-P2);

        ElMatrix<REAL> M = M2 * gaussj(M1);

        Pt2dr aTr = P2 - M* P1;

        aHX = cElComposHomographie(M(0,0),M(1,0),aTr.x);
        aHY = cElComposHomographie(M(0,1),M(1,1),aTr.y);
        aHZ = cElComposHomographie(0,0,1);

        return  aHX;
     }








     cGenSysSurResol * aSys = 
	aL2 ? 
	( cGenSysSurResol *) new L2SysSurResol(8) : 
	( cGenSysSurResol *) new SystLinSurResolu(8,aPack.size());

    aSys->SetPhaseEquation(0);
     
     for ( anIt=aPack.begin() ; anIt !=aPack.end(); anIt++)
     {
         AddCoeffSysHom(aSys,anIt->P1(),anIt->P2(),anIt->Pds(),true );
         AddCoeffSysHom(aSys,anIt->P1(),anIt->P2(),anIt->Pds(),false);
     }

    Im1D_REAL8 aSol = aSys->GSSR_Solve((bool *)0);
    REAL * aS = aSol.data();

    aHX = cElComposHomographie(aS[0],aS[1],aS[2]);
    aHY = cElComposHomographie(aS[3],aS[4],aS[5]);
    aHZ = cElComposHomographie(aS[6],aS[7],   1 );

    delete aSys;
    return aHX;
}
Ejemplo n.º 28
0
cElHomographie  cElHomographie::RobustInit(double & aDMIn,double * aQuality,const ElPackHomologue & aPack,bool & Ok ,int aNbTestEstim, double aPerc,int aNbMaxPts)
{
   cElHomographie aRes = cElHomographie::Id();
   Ok = false;
   Pt2dr aCdg(0,0);
   for (ElPackHomologue::tCstIter itH=aPack.begin() ; itH!=aPack.end() ; itH++)
   {
       aCdg = aCdg + itH->P1();
   }

   aCdg = aCdg / double(aPack.size());
   
   std::vector<std::pair<Pt2dr,Pt2dr> > aV00;
   std::vector<std::pair<Pt2dr,Pt2dr> > aV01;
   std::vector<std::pair<Pt2dr,Pt2dr> > aV10;
   std::vector<std::pair<Pt2dr,Pt2dr> > aV11;
   std::vector<std::pair<Pt2dr,Pt2dr> > aVAll;

   int aNbPtsTot = aPack.size();


   int aCpt = 0;
   for (ElPackHomologue::tCstIter itH=aPack.begin() ; itH!=aPack.end() ; itH++)
   {
        Pt2dr aP1 = itH->P1();
        Pt2dr aP2 = itH->P2();
        std::pair<Pt2dr,Pt2dr> aPair(aP1,aP2);

        if (  (((aCpt-1)*aNbMaxPts)/aNbPtsTot)  !=  ((aCpt*aNbMaxPts)/aNbPtsTot))
        {
            aVAll.push_back(aPair);
        }

        if (aP1.x < aCdg.x)
        {
            if (aP1.y < aCdg.y) aV00.push_back(aPair);
            else                aV01.push_back(aPair);
        }
        else
        {
            if (aP1.y < aCdg.y) aV10.push_back(aPair);
            else                aV11.push_back(aPair);
        }
        aCpt++;
   }


   if (aV00.empty()  || aV01.empty()  || aV10.empty()  || aV11.empty()  )
      return aRes;


   aDMIn = 1e30;
   int aNbPts = aVAll.size();
   int aNbKth = ElMax(1,ElMin(aNbPts-1,round_ni((aPerc/100.0) * aNbPts)));
   std::vector<double> aVDist;

   if (aNbMaxPts<aNbPtsTot)
      aNbTestEstim = (aNbTestEstim*aNbPtsTot) / aNbMaxPts;

   // int aKMIN = -1;
   std::vector<double> aVD; // For tuning and show in if(0) ...
   while (aNbTestEstim)
   {
       int aK00 = NRrandom3(aV00.size());
       int aK01 = NRrandom3(aV01.size());
       int aK10 = NRrandom3(aV10.size());
       int aK11 = NRrandom3(aV11.size());

       ElPackHomologue aP4;
       AddPair(aP4,aV00[aK00]);
       AddPair(aP4,aV01[aK01]);
       AddPair(aP4,aV10[aK10]);
       AddPair(aP4,aV11[aK11]);

       cElHomographie aSol = cElHomographie(aP4,true);

       aVDist.clear();
       for (int aK=0 ; aK< aNbPts ; aK++)
       {
          Pt2dr aP1 = aVAll[aK].first;
          Pt2dr aP2 = aVAll[aK].second;

/*
          Pt2dr aDif = aP2 -aSol.Direct(aP1);
          double aDx = ElAbs(aDif.x);
          double aDy = ElAbs(aDif.y);
          double aDist =  (aDx+aDy + ElMax(aDx,aDy))/ 2.0;
*/
          double aDist = QuickDist(aP2 -aSol.Direct(aP1));
          aVDist.push_back(aDist);
       }
       
       double aSom = MoyKPPVal(aVDist,aNbKth);
       
       aVD.push_back(aSom);

       //std::cout << "Robust:Hom:SOM = " << aDMIn << " " << aSom << "\n";

       if (aSom <aDMIn)
       {
          aRes = aSol;
          aDMIn = aSom;
       }
       aNbTestEstim--;
   }


   // double aDMinInit = aDMIn;
   ElPackHomologue aPckPds;
   for (int anIterL2 = 0 ; anIterL2 < 4 ; anIterL2++)
   {
       aPckPds = ElPackHomologue();
       aVDist.clear();
       int aCpt = 0;
       for (ElPackHomologue::tCstIter itH=aPack.begin() ; itH!=aPack.end() ; itH++)
       {
           Pt2dr aP1 = itH->P1();
           Pt2dr aP2 = itH->P2();
           double aDist = QuickDist(aP2 -aRes.Direct(aP1));
           aVDist.push_back(aDist);

           double aPds = 1/ (1+ 4*ElSquare(aDist/aDMIn));
           aPckPds.Cple_Add(ElCplePtsHomologues(aP1,aP2,aPds));
           aCpt++;
       }
       ELISE_ASSERT(aNbPtsTot==aPack.size() ,"KKKKK ????");
       int aKTh = round_ni(aNbPtsTot * (aPerc/100.0));

       ELISE_ASSERT(int(aVDist.size())==aNbPtsTot,"Compat MoyKPPVal/SplitArrounKthValue");
       aDMIn = MoyKPPVal(aVDist,aKTh);

       aRes = cElHomographie(aPckPds,true);
   }

   if (aQuality)
   {
      std::vector<double> aVEstim;
      int aNbTestValid = 71;
      for (int aKTest = 0 ; aKTest <aNbTestValid ; aKTest++)
      {
          ElPackHomologue aPckPdsA;
          ElPackHomologue aPckPdsB;
          cRandNParmiQ  aSelec(aNbPtsTot/2,aNbPtsTot);

          for (ElPackHomologue::tCstIter itH=aPack.begin() ; itH!=aPack.end() ; itH++)
          {
              Pt2dr aP1 = itH->P1();
              Pt2dr aP2 = itH->P2();
              double aDist = QuickDist(aP2 -aRes.Direct(aP1));
              aVDist.push_back(aDist);

              double aPds = 1/ sqrt(1+ ElSquare(aDist/aDMIn));
              // if (NRrandom3() > 0.5) 
              if (aSelec.GetNext())
                  aPckPdsA.Cple_Add(ElCplePtsHomologues(aP1,aP2,aPds));
              else
                  aPckPdsB.Cple_Add(ElCplePtsHomologues(aP1,aP2,aPds));

           
          }
          cElHomographie aResA = cElHomographie(aPckPdsA,true);
          cElHomographie aResB = cElHomographie(aPckPdsB,true);

          double aSomDist = 0; 
          for (ElPackHomologue::tCstIter itH=aPack.begin() ; itH!=aPack.end() ; itH++)
          {
              Pt2dr aP1 = itH->P1();

              Pt2dr  aQ   = aRes.Direct(aP1);
              Pt2dr  aQA  = aResA.Direct(aP1);
              Pt2dr  aQB  = aResB.Direct(aP1);
              double aDist = (QuickDist(aQ-aQA) + QuickDist(aQ-aQB) + QuickDist(aQB-aQA)) / 3.0;
              aSomDist += aDist;
          }
          aSomDist /= aNbPtsTot;
          aVEstim.push_back(aSomDist);
      }
      *aQuality  = MedianeSup(aVEstim);
   }


   Ok= true;
   return aRes;
}
Ejemplo n.º 29
0
PtsHom ReadPtsHom(string aDir, GrpVodka aGrpVodka, string Extension)
{
    PtsHom aPtsHomol;
    Pt2di aSz;
    //Looking for maxs of vectOfExpTimeISO
    double maxExpTime=0, maxISO=0;
    for (int i=0;i<int(aGrpVodka.size());i++){
        if(aGrpVodka.ExpTime[i]>maxExpTime){maxExpTime=aGrpVodka.ExpTime[i];}
        if(aGrpVodka.ISO[i]>maxISO){maxISO=aGrpVodka.ISO[i];}
    }

    //Cmpulsory for file name manipulation
    cInterfChantierNameManipulateur * aICNM = cInterfChantierNameManipulateur::BasicAlloc(aDir);

//Going through every pairs of different images
    int cpt=0;
    for (int aK1=0 ; aK1<int(aGrpVodka.size()) ; aK1++)
    {
        std::cout<<"Getting homologous points from: "<<aGrpVodka.aListIm[aK1]<<endl;

        //Reading the image and creating the objects to be manipulated
            Tiff_Im aTF1= Tiff_Im::StdConvGen(aDir + aGrpVodka.aListIm[aK1],1,false);
            aSz = aTF1.sz();
            Im2D_REAL16  aIm1(aSz.x,aSz.y);
            ELISE_COPY
                (
                   aTF1.all_pts(),
                   aTF1.in(),
                   aIm1.out()
                );

            REAL16 ** aData1 = aIm1.data();

        for (int aK2=0 ; aK2<int(aGrpVodka.size()) ; aK2++)
        {
            Tiff_Im aTF2= Tiff_Im::StdConvGen(aDir + aGrpVodka.aListIm[aK2],1,false);
            Im2D_REAL16  aIm2(aSz.x,aSz.y);
            ELISE_COPY
                (
                   aTF2.all_pts(),
                   aTF2.in(),
                   aIm2.out()
                );

            REAL16 ** aData2 = aIm2.data();

            string prefixe="";
            if (aK1!=aK2)
            {
               std::string aNamePack =  aDir +  aICNM->Assoc1To2
                                        (
                                           "NKS-Assoc-CplIm2Hom@"+prefixe + "@" + Extension,
                                           aGrpVodka.aListIm[aK1],
                                           aGrpVodka.aListIm[aK2],
                                           true
                                        );

                   bool Exist = ELISE_fp::exist_file(aNamePack);
                   if (Exist)
                   {
                      ElPackHomologue aPack = ElPackHomologue::FromFile(aNamePack);

                           for
                           (
                               ElPackHomologue::const_iterator itP=aPack.begin();
                               itP!=aPack.end();
                               itP++
                           )
                           {
                                cpt++;
                                //Compute the distance between the point and the center of the image
                                double x0=aSz.x/2-0.5;
                                double y0=aSz.y/2-0.5;
                                double Dist1=sqrt(pow(itP->P1().x-x0,2)+pow(itP->P1().y-y0,2));
                                double Dist2=sqrt(pow(itP->P2().x-x0,2)+pow(itP->P2().y-y0,2));
                                //Go looking for grey value of the point, adjusted to ISO and Exposure time induced variations
                                double Grey1 =sqrt((aGrpVodka.ExpTime[aK1]*aGrpVodka.ISO[aK1])/(maxExpTime*maxISO))*Reechantillonnage::biline(aData1, aSz.x, aSz.y, itP->P1());
                                double Grey2 =sqrt((aGrpVodka.ExpTime[aK2]*aGrpVodka.ISO[aK2])/(maxExpTime*maxISO))*Reechantillonnage::biline(aData2, aSz.x, aSz.y, itP->P2());

                                aPtsHomol.Dist1.push_back(Dist1);
                                aPtsHomol.Dist2.push_back(Dist2);
                                aPtsHomol.Gr1.push_back(Grey1);
                                aPtsHomol.Gr2.push_back(Grey2);

                   }
                   }
                   else
                      std::cout  << "     # NO PACK FOR  : " << aNamePack  << "\n";
            }
        }
    }
    int nbpts=aPtsHomol.size();
    std::cout<<"Total number tie points: "<<nbpts<<" out of "<<cpt<<endl;
    aPtsHomol.SZ=aSz;

   return aPtsHomol;
}