ElPackHomologue PackFromCplAPF(const cMesureAppuiFlottant1Im & aMes, const cMesureAppuiFlottant1Im & aRef) { ElPackHomologue aRes; for ( std::list<cOneMesureAF1I>::const_iterator iT=aMes.OneMesureAF1I().begin(); iT!=aMes.OneMesureAF1I().end(); iT++ ) { const cOneMesureAF1I * aPt = PtsOfName(aRef,iT->NamePt()); if (aPt!=0) { aRes.Cple_Add(ElCplePtsHomologues(iT->PtIm(),aPt->PtIm())); } else { std::cout << "For name " << iT->NamePt() << "\n"; ELISE_ASSERT(false,"Cannot get name in merging two cMesureAppuiFlottant1Im"); } } return aRes; }
void cAppliApero::SimuleOneLiaison ( const cGenerateLiaisons & aGL, const std::list<Pt3dr> & aLP3, cPoseCam & aCam1, cPoseCam & aCam2 ) { const CamStenope * aCS1 = aCam1.CurCam(); const CamStenope * aCS2 = aCam2.CurCam(); ElPackHomologue aPack; for(std::list<Pt3dr>::const_iterator itP3=aLP3.begin();itP3!=aLP3.end();itP3++) { Pt2dr aPIm1 = aCS1->R3toF2(*itP3)+Pt2dr(NRrandC(),NRrandC())*aGL.BruitIm1(); Pt2dr aPIm2 = aCS2->R3toF2(*itP3)+Pt2dr(NRrandC(),NRrandC())*aGL.BruitIm2(); aPack.Cple_Add(ElCplePtsHomologues(aPIm1,aPIm2)); } std::string aName = mDC+mICNM->Assoc1To2(aGL.KeyAssoc(),aCam1.Name(),aCam2.Name(),true); cElXMLFileIn aFileXML(aName); aFileXML.PutPackHom(aPack); }
Pt2dr cApply_CreateEpip_main::DirEpipIm2(cBasicGeomCap3D * aG1,cBasicGeomCap3D * aG2,ElPackHomologue & aPack,bool AddToP1) { Pt2dr aSz = Pt2dr(aG1->SzBasicCapt3D()); Pt2dr aSomTens2(0,0); double aIProf = aG1->GetVeryRoughInterProf(); double aEps = 5e-4; double aLenghtSquare = ElMin(mLengthMin,sqrt((aSz.x*aSz.y) / (mNbXY*mNbXY))); int aNbX = ElMax(1+3*mDegre,round_up(aSz.x /aLenghtSquare)); int aNbY = ElMax(1+3*mDegre,round_up(aSz.y /aLenghtSquare)); std::cout << "NBBBB " << aNbX << " " << aNbY << "\n"; for (int aKX=0 ; aKX<= aNbX ; aKX++) { double aPdsX = ElMax(aEps,ElMin(1-aEps,aKX /double(aNbX))); for (int aKY=0 ; aKY<= aNbY ; aKY++) { double aPdsY = ElMax(aEps,ElMin(1-aEps,aKY/double(aNbY))); Pt2dr aPIm1 = aSz.mcbyc(Pt2dr(aPdsX,aPdsY)); if (aG1->CaptHasData(aPIm1)) { Pt3dr aPT1; Pt3dr aC1; aG1->GetCenterAndPTerOnBundle(aC1,aPT1,aPIm1); std::vector<Pt2dr> aVPIm2; for (int aKZ = -mNbZ ; aKZ <= mNbZ ; aKZ++) { Pt3dr aPT2 = aC1 + (aPT1-aC1) * (1+(aIProf*aKZ) / mNbZ); if (aG1->PIsVisibleInImage(aPT2) && aG2->PIsVisibleInImage(aPT2)) { aVPIm2.push_back(aG2->Ter2Capteur(aPT2)); ElCplePtsHomologues aCple(aPIm1,aVPIm2.back(),1.0); if (! AddToP1) aCple.SelfSwap(); aPack.Cple_Add(aCple); } } if (aVPIm2.size() >=2) { Pt2dr aDir2 = vunit(aVPIm2.back()-aVPIm2[0]); aSomTens2 = aSomTens2 + aDir2 * aDir2; // On double l'angle pour en faire un tenseur } } } } Pt2dr aRT = Pt2dr::polar(aSomTens2,0.0); return Pt2dr::FromPolar(1.0,aRT.y/2.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; }
ElPackHomologue ToStdPack(const tMergeLPackH * aMPack,bool PondInvNorm,double aPdsSingle) { ElPackHomologue aRes; const tLMCplP & aLM = aMPack->ListMerged(); for ( tLMCplP::const_iterator itC=aLM.begin() ; itC!=aLM.end() ; itC++) { const Pt2dr & aP0 = (*itC)->GetVal(0); const Pt2dr & aP1 = (*itC)->GetVal(1); double aPds = ((*itC)->NbArc() == 1) ? aPdsSingle : 1.0; if (PondInvNorm) { aPds /= NormPt2Ray(aP0) * NormPt2Ray(aP1); } ElCplePtsHomologues aCple(aP0,aP1,aPds); aRes.Cple_Add(aCple); } return aRes; }
void cAppliReduc::AmelioHomLocal(cImagH & anIm) { double aPdsLVMStd = 0.1; double aPdsFreezC = 100; double aPdsEvol = 10;; int aNbIterSupl = 3; int aMaxIterProgr = 6; const std::vector<cLink2Img*> & aVLImC = mImCAmel->VLink(); for (int aKIm=0 ; aKIm<int(mIms.size()) ; aKIm++) { mIms[aKIm]->HF()->ReinitHom(cElHomographie::Id()); mIms[aKIm]->GainLoc() = 0; mIms[aKIm]->InitLoc() = false; } std::vector<cImagH *> aVIms ; for (int aKL=0 ; aKL<int(aVLImC.size()) ; aKL++) { cLink2Img * aLnK = aVLImC[aKL]; cImagH * anIm = aLnK->Dest(); anIm->GainLoc() = aLnK->PdsEchant() + 1e-7; anIm->C2CI() = true; aVIms.push_back(anIm); anIm->HF()->ReinitHom(aLnK->Hom12().Inverse()); } mImCAmel->GainLoc() = 1e10; mImCAmel->InitLoc() = true; mImCAmel->C2CI() = true; int aNbIm2Init = aVIms.size(); cCmpPtrImOnGain aCmpPtrIm; std::sort(aVIms.begin(),aVIms.end(),aCmpPtrIm); int aNbIterProgr = std::min(aMaxIterProgr,round_up(aVIms.size()/3.0)); int aNbIterTot = aNbIterProgr + aNbIterSupl; double aErrorIn = ErrorSolLoc(); if (Show(eShowGlob)) std::cout << "ERROR IN " << aErrorIn << "\n"; for (int aNbIter =0 ; aNbIter < aNbIterTot ; aNbIter ++) { if (aNbIter < aNbIterProgr) { int aK0 = (aNbIter *aNbIm2Init) / aNbIterProgr; int aK1 = ((aNbIter+1) *aNbIm2Init) / aNbIterProgr; for (int aKIm=aK0; aKIm<aK1 ; aKIm++) { ElPackHomologue aPack; cImagH * anIm = aVIms[aKIm]; const std::vector<cLink2Img*> & aVL = anIm->VLink(); int aNbInit=0; for (int aKL=0 ; aKL<int(aVL.size()) ; aKL++) { cLink2Img * aLnK = aVL[aKL]; cImagH * anI2 = aLnK->Dest(); if (anI2->InitLoc()) { const std::vector<Pt3dr> & anEch = aLnK->EchantP1(); cElHomographie aH = anI2->HF()->HomCur() * aLnK->Hom12(); for (int aKP=0 ; aKP<int(anEch.size()) ; aKP++) { const Pt3dr & aP3d = anEch[aKP]; Pt2dr aP1 (aP3d.x,aP3d.y); double aPds = aP3d.z; Pt2dr aP2 = aH.Direct(aP1); aPack.Cple_Add(ElCplePtsHomologues(aP1,aP2,aPds)); } aNbInit++; } } cElHomographie aNewH(aPack,true); anIm->HF()->ReinitHom(aNewH); if (Show(eShowDetail)) std::cout << anIm->Name() << " : " << aNbInit << "\n"; } for (int aKIm=aK0; aKIm<aK1 ; aKIm++) { aVIms[aKIm]->InitLoc() = true; } if (Show(eShowDetail)) std::cout << "==============================\n"; } if (mDoCompensLoc) { mSetEq.SetPhaseEquation(); double aSomEr=0; double aSomP=0; for (int aKIm1=0 ; aKIm1<int(mIms.size()) ; aKIm1++) { cImagH * anI1 = mIms[aKIm1]; anI1->AddViscositty((anI1== mImCAmel) ? aPdsFreezC : aPdsLVMStd); cElHomographie aCurH1 = anI1->HF()->HomCur(); if (anI1->InitLoc()) { double aPdsE = aPdsEvol / anI1->PdsEchant(); const std::vector<cLink2Img*> & aVL = anI1->VLink(); for (int aKL=0 ; aKL<int(aVL.size()) ; aKL++) { cLink2Img * aLnk = aVL[aKL]; cImagH* anI2 = aLnk->Dest(); cElHomographie aCurH2 = anI2->HF()->HomCur(); cElHomographie aCurH2Inv = aCurH2.Inverse(); if (anI2->InitLoc()) { double aSomRes = 0; double aSomCtrl = 0; cElHomographie aH12 = aLnk->Hom12(); const std::vector<Pt3dr> & anEch = aLnk->EchantP1(); cEqHomogFormelle * anEq = aLnk->EqHF(); int aNbPts = anEch.size(); for (int aKEch = 0 ; aKEch<int(aNbPts) ; aKEch++) { Pt3dr aP3d = anEch[aKEch]; Pt2dr aP1(aP3d.x,aP3d.y); Pt2dr aP2 = aH12.Direct(aP1); double aPds = aP3d.z * aPdsE; Pt2dr aRes = anEq->StdAddLiaisonP1P2(aP1,aP2,aPds,false); Pt2dr aCtrl = aCurH2Inv.Direct(aCurH1.Direct(aP1)) - aP2; aSomRes += euclid(aRes); aSomCtrl += euclid(aCtrl); double anEr = square_euclid(aRes); aSomEr+= anEr * aPds; aSomP+= aPds; } /* std::cout << anEq << " N12=" << anI1->Name() << " " << anI2->Name() << " ; RES = " << aSomRes/aNbPts << " Ctrl=" << aSomCtrl/aNbPts << "\n"; */ } } } // getchar(); // anI->HF()->SetModeCtrl(cNameSpaceEqF::eHomFigee); } if (Show(eShowDetail)) std::cout << "ERR = " << sqrt(aSomEr/aSomP) << "\n"; mSetEq.SolveResetUpdate(); } } for (int aKIm1=0 ; aKIm1<int(mIms.size()) ; aKIm1++) { cImagH * anI1 = mIms[aKIm1]; anI1->H2ImC() = anI1->HF()->HomCur(); } double aErrorOut = ErrorSolLoc(); if (Show(eShowGlob)) std::cout << "ERROR OUT " << aErrorOut << " DELTA=" << aErrorOut - aErrorIn << "\n"; }
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; }
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; }
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; }
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); } }
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; }
void AddPair(ElPackHomologue & aPack,const std::pair<Pt2dr,Pt2dr> &aPair) { aPack.Cple_Add(ElCplePtsHomologues(aPair.first,aPair.second)); }
void cElHomographie::AddForInverse(ElPackHomologue & aPack,Pt2dr aP) const { aPack.Cple_Add(ElCplePtsHomologues(Direct(aP),aP,1.0)); }