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; }
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); } }
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; }
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; } }
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"; } }
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; }
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())) ); } }
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; } }
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 } }
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); } }
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; }
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; } } }
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"; } }
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; }
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) : }
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; }
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; }
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); } }
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; } }
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; }
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; }
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; }