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; }
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() ); } }
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(); */ } }
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; }