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";
   }
}
CamStenope * cNewO_NameManager::CamOfName(const std::string  & aName) 
{

   cMetaDataPhoto aMTD = cMetaDataPhoto::CreateExiv2(mDir+aName);

   if (mPrefOriCal =="")
   {
        std::vector<double> aPAF;
        double aFPix  = aMTD.FocPix();
        Pt2di  aSzIm  = aMTD.XifSzIm();
        Pt2dr  aPP = Pt2dr(aSzIm) / 2.0;

        bool IsFE;
        FromString(IsFE,mICNM->Assoc1To1("NKS-IsFishEye",aName,true));
        std::string aNameCal = "CamF" + ToString(aFPix) +"_Sz"+ToString(aSzIm) + "FE"+ToString(IsFE);
        if (DicBoolFind(mDicoCam,aNameCal))
           return mDicoCam[aNameCal];
        CamStenope * aRes = 0;

        if (IsFE)
        {
            std::vector<double> aVP;
            std::vector<double> aVE;
            aVE.push_back(aFPix);
            aVP.push_back(aPP.x);
            aVP.push_back(aPP.y);
            aRes = new cCamLin_FishEye_10_5_5
                       (
                            false,
                            aFPix,aPP,Pt2dr(aSzIm),
                            aPAF,
                            &aVP,
                            &aVE
                       );

        }
        else
        {
             aRes = new CamStenopeIdeale(false,aFPix,aPP,aPAF);
        }
        aRes->SetSz(aSzIm);
        mDicoCam[aNameCal] =  aRes;
        return aRes;
   }


   std::string  aNC = mICNM->StdNameCalib(mPrefOriCal,aName);

   if (DicBoolFind(mDicoCam,aNC))
      return mDicoCam[aNC];

   mDicoCam[aNC] =  CamOrientGenFromFile(aNC,mICNM);

   return mDicoCam[aNC];
}
void cMA_AffineOrient::StateOri2(const std::string & aMes)
{
   // OO Pt3dr aSom = mOri2->orsommet_de_pdv_terrain();
   Pt3dr aSom = mOri2->PseudoOpticalCenter();
   Pt3dr aTr  = mCamF2->RF().CurRot().tr();
   std::cout  << aMes << (aSom-aTr) << " "
             << aSom << " " << aTr << "\n";
}
ElRotation3D  CombinatoireOFPA
              (
                   bool TousDevant,
                   CamStenope & aCam,
                   INT  NbTest,
                   const cListeAppuis1Im & aLA,
                   REAL * Res_Dmin
              )
{
   return aCam.CombinatoireOFPA(TousDevant,NbTest,Xml2EL(aLA),Res_Dmin);
}
void cChangeCamFormat::DoAll()
{
   mEq =  mSet.NewEqCalibCroisee(mC2M,*mPIF);
   mSet.SetClosed();

   for (int aKet=0 ; aKet< 30 ; aKet++)
   {
       if (mPIF_DR)
       {
           if (aKet== 1)
	      mPIF_DR->SetFocFree(true);

           if (aKet >= 3)
	   {
	      int aDegre =  ElMin(mDegRadOut,1+ (aKet-3)/3);
	      mPIF_DR->SetDRFDegreFige(aDegre);
           }

           if (aKet >= 10)
	       mPIF_DR->SetCDistPPLie();

           if ((aKet >= 15) && (! mCDistPPLie))
               mPIF_DR->SetLibertePPAndCDist(true,true);
       }
       else 
       {
          ELISE_ASSERT(false,"Unknown Cam Modele");
       }
       int aNBP = 20;
       mSet.AddContrainte(mPIF->StdContraintes(),true);
       mSet.AddContrainte(mEq->RotF().StdContraintes(),true);

       for (int aKx=0 ; aKx<= aNBP ; aKx++)
       {
            double aPdsX = aKx / double(aNBP);
            for (int aKy=0 ; aKy<= aNBP ; aKy++)
            {
                double aPdsY = aKy / double(aNBP);
	        Pt2dr aP0  (mSz.x*aPdsX,mSz.y*aPdsY);
		Pt3dr aDir = mCamInput->F2toDirRayonL3(aP0);
		Pt2dr aPNew = ToNewCoord(aP0);
		mEq->AddObservation(aPNew,aDir);
            }
       }

        mSet.SolveResetUpdate();
   }
}
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;
}
示例#7
0
void Drunk(string aFullPattern,string aOri,string DirOut, bool Talk)
{
    string aPattern,aNameDir;
    SplitDirAndFile(aNameDir,aPattern,aFullPattern);

    //Reading input files
    list<string> ListIm=RegexListFileMatch(aNameDir,aPattern,1,false);
    int nbIm=ListIm.size();
    if (Talk){cout<<"Images to process: "<<nbIm<<endl;}

    //Paralelizing (an instance of Drunk is called for each image)
    string cmdDRUNK;
    list<string> ListDrunk;
    if(nbIm!=1)
    {
        for(int i=1;i<=nbIm;i++)
        {
            string aFullName=ListIm.front();
            ListIm.pop_front();
            cmdDRUNK=MMDir() + "bin/Drunk " + aNameDir + aFullName + " " + aOri + " Out=" + DirOut + " Talk=0";
            ListDrunk.push_back(cmdDRUNK);
        }
        cEl_GPAO::DoComInParal(ListDrunk,aNameDir + "MkDrunk");

        //Calling the banner at the end
        if (Talk){Drunk_Banniere();}
    }else{

    //Bulding the output file system
    ELISE_fp::MkDirRec(aNameDir + DirOut);

    //Processing the image
    string aNameIm=ListIm.front();
    string aNameOut=aNameDir + DirOut + aNameIm + ".tif";

    //Loading the camera
    string aNameCam="Ori-"+aOri+"/Orientation-"+aNameIm+".xml";
    cInterfChantierNameManipulateur * anICNM = cInterfChantierNameManipulateur::BasicAlloc(aNameDir);
    CamStenope * aCam = CamOrientGenFromFile(aNameCam,anICNM);

    //Reading the image and creating the objects to be manipulated
    Tiff_Im aTF= Tiff_Im::StdConvGen(aNameDir + aNameIm,3,false);

    Pt2di aSz = aTF.sz();

    Im2D_U_INT1  aImR(aSz.x,aSz.y);
    Im2D_U_INT1  aImG(aSz.x,aSz.y);
    Im2D_U_INT1  aImB(aSz.x,aSz.y);
    Im2D_U_INT1  aImROut(aSz.x,aSz.y);
    Im2D_U_INT1  aImGOut(aSz.x,aSz.y);
    Im2D_U_INT1  aImBOut(aSz.x,aSz.y);

    ELISE_COPY
    (
       aTF.all_pts(),
       aTF.in(),
       Virgule(aImR.out(),aImG.out(),aImB.out())
    );

    U_INT1 ** aDataR = aImR.data();
    U_INT1 ** aDataG = aImG.data();
    U_INT1 ** aDataB = aImB.data();
    U_INT1 ** aDataROut = aImROut.data();
    U_INT1 ** aDataGOut = aImGOut.data();
    U_INT1 ** aDataBOut = aImBOut.data();

    //Parcours des points de l'image de sortie et remplissage des valeurs
    Pt2dr ptOut;
    for (int aY=0 ; aY<aSz.y  ; aY++)
    {
        for (int aX=0 ; aX<aSz.x  ; aX++)
        {
            ptOut=aCam->DistDirecte(Pt2dr(aX,aY));

            aDataROut[aY][aX] = Reechantillonnage::biline(aDataR, aSz.x, aSz.y, ptOut);
            aDataGOut[aY][aX] = Reechantillonnage::biline(aDataG, aSz.x, aSz.y, ptOut);
            aDataBOut[aY][aX] = Reechantillonnage::biline(aDataB, aSz.x, aSz.y, ptOut);

        }
    }

    Tiff_Im  aTOut
             (
                  aNameOut.c_str(),
                  aSz,
                  GenIm::u_int1,
                  Tiff_Im::No_Compr,
                  Tiff_Im::RGB
             );


     ELISE_COPY
     (
         aTOut.all_pts(),
         Virgule(aImROut.in(),aImGOut.in(),aImBOut.in()),
         aTOut.out()
     );
    }
}
示例#8
0
int TestCam_main(int argc,char ** argv)
{
    std::string aFullName;
    std::string aNameCam;
    std::string aNameDir;
    std::string aNameTag = "OrientationConique";
    bool ExtP = false;
    bool TOC = false;
    Pt2dr TDINV;

    double X,Y,Z;
    X = Y = Z = 0;
    bool aModeGrid = false;
    std::string Out;

    ElInitArgMain
    (
    argc,argv,
    LArgMain()  << EAMC(aFullName,"File name", eSAM_IsPatFile)
                << EAMC(X,"x")
                << EAMC(Y,"y")
                << EAMC(Z,"z"),
    LArgMain()
                    << EAM(aNameTag,"Tag",true,"Tag to get cam")
                    << EAM(aModeGrid,"Grid",true,"Test Grid Mode", eSAM_IsBool)
                    << EAM(Out,"Out",true,"To Regenerate an orientation file",eSAM_NoInit)
                    << EAM(ExtP,"ExtP",true,"Detail on external parameter", eSAM_IsBool)
                    << EAM(TOC,"TOC",true,"Test corners", eSAM_IsBool)
                    << EAM(TDINV,"TDINV",true,"Test Dist Inv",eSAM_NoInit)
    );

    SplitDirAndFile(aNameDir,aNameCam,aFullName);

    cInterfChantierNameManipulateur * anICNM = cInterfChantierNameManipulateur::BasicAlloc(aNameDir);
/*
    cTplValGesInit<std::string>  aTplFCND;
    cInterfChantierNameManipulateur * anICNM =
        cInterfChantierNameManipulateur::StdAlloc(0,0,aNameDir,aTplFCND);
*/


   ElCamera * aCam  = Gen_Cam_Gen_From_File(aModeGrid,aFullName,aNameTag,anICNM);

   CamStenope * aCS = aCam->CS();

   if (ExtP)
   {
       std::cout << "  ###########  EXTERNAL ##############\n";
       if (aCS)
       {
           std::cout << "Center " << aCS->VraiOpticalCenter() << "\n";
       }
       std::cout <<  "  I : " << aCS->L3toR3(Pt3dr(1,0,0)) - aCS->L3toR3(Pt3dr(0,0,0)) << "\n";
       std::cout <<  "  J : " << aCS->L3toR3(Pt3dr(0,1,0)) - aCS->L3toR3(Pt3dr(0,0,0))<< "\n";
       std::cout <<  "  K : " << aCS->L3toR3(Pt3dr(0,0,1)) - aCS->L3toR3(Pt3dr(0,0,0))<< "\n";
       std::cout << "\n";
   }

    if (TOC)
       TestOneCorner(aCam);

    if (EAMIsInit(&TDINV))
       TestDistInv(aCam,TDINV);



   if (aModeGrid)
   {
       std::cout << "Camera is grid " << aCam->IsGrid() << " " << aCam->Dist().Type() << "\n";
   }


   TestCamCHC(*aCam);

   TestDirect(aCam,Pt3dr(X,Y,Z));

   if (Out!="")
   {
         cOrientationConique aCO = aCam->StdExportCalibGlob();
         MakeFileXML(aCO,Out);
   }

    return EXIT_SUCCESS;
}
void cParamIntrinsequeFormel::UpdateCamGrid( double aTol)
{
   if (UseAFocal()  &&  (! AFocalAcceptNoDist))
      return;
   bool aLastFiged = mFiged;
   mFiged = AllParamIsFiged() ;
   // Si rien n'a change
   if (aLastFiged == mFiged)
      return;

   // On passe de fige a mobile, donc plus de grille
   if (aLastFiged)
   {
        delete mCamGrid;
        mCamGrid =0;
        return;
   }

   //   On se fige
   //
 
      CamStenope * aCS = CurPIF();

      Pt2di aRab(20,20);
      Pt2di aStep(10,10);
      double aRabR = 0;
      Pt2di aSz = aCS->Sz();

      double aR = euclid(aSz)/2.0;
      if (aCS->HasRayonUtile())
         aR = aCS->RayonUtile();

// std::cout << "iuytml RAY = " << aR << " SZR " <<  euclid(aSz)/2.0 << "\n";

      mCamGrid = cCamStenopeGrid::Alloc(aR+aRabR,*aCS,Pt2dr(aStep),true,true);
      if (mCamGrid)
      {

          mRayonGrid = 1e20;

// std::cout << "iuytml END CGID  \n";

           double aEcMax =0;
           for (int aKx=100 ; aKx< aCS->Sz().x ; aKx += 200)
           {
               for (int aKy=100 ; aKy< aCS->Sz().y ; aKy += 200)
               {
                   Pt2dr aP(aKx,aKy);
                   // std::cout << "IZU " << mCamGrid->IsInZoneUtile(aP) << " " << aP << "\n";
                   if (mCamGrid->IsInZoneUtile(aP))
                   {
                      // UVGCC4.6 double aEps=1e-5;

                       Pt3dr aRay = aCS->F2toDirRayonL3(aP);
                       // UVGCC4.6 Pt3dr aRayG = mCamGrid->F2toDirRayonL3(aP);


                       // UVGCC4.6 Pt3dr  aRayX = aRay + Pt3dr(aEps,0,0);
                       // UVGCC4.6 Pt3dr  aRayY = aRay + Pt3dr(0,aEps,0);

                       Pt2dr aP1 = aCS->L3toF2(aRay);
                       Pt2dr aPG = mCamGrid->L3toF2(aRay);


                       // UVGCC4.6 Pt2dr aDx = (mCamGrid->L3toF2(aRayX)-aPG)/aEps;
                       // UVGCC4.6 Pt2dr aDy = (mCamGrid->L3toF2(aRayY)-aPG)/aEps;


                       Pt2dr aDGX,aDGY;
                       // UVGCC4.6 Pt2dr aPG2 = mCamGrid->L2toF2AndDer(Pt2dr(aRay.x,aRay.y),aDGX,aDGY);

                // std::cout << aPG << aDx << aDy << "\n";
                // std::cout <<  "    " << aPG2 << aDGX << aDGY << "\n";

                       double aDist = euclid(aP1,aPG);
                       if ( aDist >aTol)
                          mRayonGrid = ElMin(mRayonGrid,euclid(aP,aSz/2.0));
                       aEcMax = ElMax(aDist,aEcMax);
                    }
               }
           }
/*

        std::cout << "GetC ------------RTOl------------ " << mRayonGrid   << " -EcMax " << aEcMax << "\n"; 
         getchar();
*/

    }


}
示例#10
0
Im2D_REAL4 cZBuf::BasculerUnMaillage(const cMesh &aMesh, const CamStenope &aCam)
{
    mRes = Im2D_REAL4(mSzRes.x,mSzRes.y,mDpDef);
    mDataRes = mRes.data();
    mImTriIdx = Im2D_INT4(mSzRes.x,mSzRes.y, mIdDef);

    vector <cTriangle> vTriangles;
    aMesh.getTriangles(vTriangles);

    vector <bool> vTrianglesPartiels;  //0= ok 1=partiellement vu ou caché

    for (unsigned int aK =0; aK<vTriangles.size();++aK)
    {
        vTrianglesPartiels.push_back(false);
    }

    for (unsigned int aK =0; aK<vTriangles.size();++aK)
    {
        cTriangle aTri = vTriangles[aK];

        vector <Pt3dr> Sommets;
        aTri.getVertexes(Sommets);

        if (Sommets.size() == 3)
        {
            Pt2dr A2 = aCam.R3toF2(Sommets[0]);
            Pt2dr B2 = aCam.R3toF2(Sommets[1]);
            Pt2dr C2 = aCam.R3toF2(Sommets[2]);

            Pt2dr AB = B2-A2;
            Pt2dr AC = C2-A2;
            REAL aDet = AB^AC;

            if (aDet!=0)
            {

               /* Pt2di A2i = round_down(A2);
                Pt2di B2i = round_down(B2);
                Pt2di C2i = round_down(C2);

                 //On verifie que le triangle se projete entierement dans l'image
                 //TODO: gerer les triangles de bord
                if (A2i.x < 0 || B2i.x < 0 || C2i.x < 0 || A2i.y < 0 || B2i.y < 0 || C2i.y < 0 || A2i.x >= mSzRes.x || B2i.x >= mSzRes.x || C2i.x >= mSzRes.x || A2i.y >= mSzRes.y  || B2i.y >= mSzRes.y  || C2i.y >= mSzRes.y)
                     return;*/

                Pt3dr center = aCam.OrigineProf();
                REAL zA = euclid(Sommets[0] - center);  //repris de ElNuage3DMaille ProfOfPtE()
                REAL zB = euclid(Sommets[1] - center);
                REAL zC = euclid(Sommets[2] - center);

                Pt2di aP0 = round_down(Inf(A2,Inf(B2,C2)));
                aP0 = Sup(aP0,Pt2di(0,0));
                Pt2di aP1 = round_up(Sup(A2,Sup(B2,C2)));
                aP1 = Inf(aP1,mSzRes-Pt2di(1,1));


                for (INT x=aP0.x ; x<= aP1.x ; x++)
                    for (INT y=aP0.y ; y<= aP1.y ; y++)
                    {
                        Pt2dr AP = Pt2dr(x,y)-A2;

                        // Coordonnees barycentriques de P(x,y)
                        REAL aPdsB = (AP^AC) / aDet;
                        REAL aPdsC = (AB^AP) / aDet;
                        REAL aPdsA = 1 - aPdsB - aPdsC;
                        if ((aPdsA>-Eps) && (aPdsB>-Eps) && (aPdsC>-Eps))
                        {
                            REAL4 aZ = (float) (zA*aPdsA + zB*aPdsB + zC*aPdsC);
                            if (aZ<mDataRes[y][x])
                            {
                                int index = mImTriIdx.GetI(Pt2di(x,y));
                                if (index != mIdDef) vTrianglesPartiels[index] = true;
                                mDataRes[y][x] = aZ;
                                mImTriIdx.SetI(Pt2di(x,y),aTri.getIdx());
                            }
                        }
                    }
            }
        }
    }

    //on enleve les triangles partiellement vus
    for(int aK=0; aK < mSzRes.x; aK++)
        for (int bK=0; bK < mSzRes.y; bK++)
        {
            int index = mImTriIdx.GetI(Pt2di(aK,bK));
            if (vTrianglesPartiels[index])
            {
                mDataRes[bK][aK] = mDpDef;
                mImTriIdx.SetI(Pt2di(aK,bK),USHRT_MAX);
            }
            else if ((index != mIdDef) && (find(vTri.begin(), vTri.end(), index)==vTri.end())) vTri.push_back(index);
        }

    return mRes;
}
void cChangeCamFormat::SetDRad(bool CDistPPLie,int aDegRadOut)
{
   mCDistPPLie = CDistPPLie;
   mDegRadOut  = aDegRadOut;

   ElDistRadiale_PolynImpair aDist =  ElDistRadiale_PolynImpair::DistId(mRay,mPPInit,5);
   cCamStenopeDistRadPol * aCamDRInit = new cCamStenopeDistRadPol(mC2M,mFInit,mPPInit,aDist,mCamInput->ParamAF());

   mCamInit = aCamDRInit;

   mPIF_DR  = mSet.NewIntrDistRad (mC2M,aCamDRInit,0);
   mPIF_DR->SetFocFree(false);
   mPIF_DR->SetLibertePPAndCDist(false,false);

   mPIF = mPIF_DR;
}