Appar23 Xml2EL(const cMesureAppuis & aMA) { return Appar23(aMA.Im(),aMA.Ter(),aMA.Num().ValWithDef(-1)); }
void cAppliOptimTriplet::TestOPA(cPairOfTriplet & aPair) { ElRotation3D aR1 = ElRotation3D::Id; std::list<Appar23> aL32; int aI1 = aPair.Im1().Num(); int aI2 = aPair.Im2().Num(); int aI3 = aPair.Im3().Num(); const std::vector<Pt2df> & aVP1 = *(mRedH123[aI1]); const std::vector<Pt2df> & aVP2 = *(mRedH123[aI2]); const std::vector<Pt2df> & aVP3 = *(mRedH123[aI3]); ElRotation3D aR2 = aPair.R12Pair(); if ( aVP1.size() < 4) return; for (int aKP=0 ; aKP<int(aVP1.size()) ; aKP++) { std::vector<Pt3dr> aVA; std::vector<Pt3dr> aVB; const Pt2df & aP1 = aVP1[aKP]; aVA.push_back(Pt3dr(0,0,0)); aVB.push_back(Pt3dr(aP1.x,aP1.y,1.0)); const Pt2df & aP2 = aVP2[aKP]; aVA.push_back(aR2.ImAff(Pt3dr(0,0,0))); aVB.push_back(aR2.ImAff(Pt3dr(aP2.x,aP2.y,1.0))); bool OkI; Pt3dr anInter = InterSeg(aVA,aVB,OkI); if (OkI) { const Pt2df & aP3 = aVP3[aKP]; aL32.push_back(Appar23(Pt2dr(aP3.x,aP3.y),anInter)); } } ElTimer aChrono; CamStenopeIdeale aCSI = CamStenopeIdeale::CameraId(true,ElRotation3D::Id); double anEcart; int aNbRansac = mQuick ? QuickNbRansac : StdNbRansac; ElRotation3D aR3 = aCSI.RansacOFPA(true,aNbRansac,aL32,&anEcart); aR3 = aR3.inv(); std::vector<ElRotation3D> aVR(3,ElRotation3D::Id); aVR[aI1] = aR1; aVR[aI2] = aR2; aVR[aI3] = aR3; ElRotation3D aR0 = aVR[0]; for (int aK=0 ; aK<3 ; aK++) { aVR[aK] = aR0.inv() * aVR[aK] ; // aVR[aK] = aVR[aK] * aR0.inv() ; } double aFact = euclid(aVR[1].tr()); aVR[1] = ElRotation3D(aVR[1].tr()/aFact,aVR[1].Mat(),true); aVR[2] = ElRotation3D(aVR[2].tr()/aFact,aVR[2].Mat(),true); double aResidu = ResiduGlob(aVR[0],aVR[1],aVR[2]); if (aResidu < mBestResidu) { mBestResidu = aResidu; for (int aK=0 ; aK<3 ; aK++) mIms[aK]->SetOri(aVR[aK]); } }