Appar23  Xml2EL(const cMesureAppuis & aMA)
{
   return Appar23(aMA.Im(),aMA.Ter(),aMA.Num().ValWithDef(-1));
}
Ejemplo n.º 2
0
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]);
    }
}