Skip to content

Commit

Permalink
Perturb Random Orient : test ply
Browse files Browse the repository at this point in the history
  • Loading branch information
deseilligny committed Jan 15, 2025
1 parent a2e6ec6 commit 5834056
Show file tree
Hide file tree
Showing 7 changed files with 138 additions and 22 deletions.
5 changes: 3 additions & 2 deletions MMVII/include/MMVII_DeclareAllCmd.h
Original file line number Diff line number Diff line change
Expand Up @@ -112,10 +112,11 @@ extern cSpecMMVII_Appli TheSpec_ExportUndistMesIm;
extern cSpecMMVII_Appli TheSpecAppliExtractLine;
extern cSpecMMVII_Appli TheSpec_CERN_ImportClino;
extern cSpecMMVII_Appli TheSpec_MMV2_MesIm_2_MMV1;

extern cSpecMMVII_Appli TheSpec_MergeMesImGCP;

extern cSpecMMVII_Appli TheSpec_ExifData;

extern cSpecMMVII_Appli TheSpec_PerturbRandomOri;

};

#endif // _MMVII_DeclareAllCmd_H_
3 changes: 3 additions & 0 deletions MMVII/include/MMVII_PCSens.h
Original file line number Diff line number Diff line change
Expand Up @@ -485,6 +485,8 @@ class cSensorCamPC : public cSensorImage
const cPixelDomain & PixelDomain() const override;

void SetPose(const tPose & aPose);
void SetOrient(const tRotR & anOrient);
void SetCenter(const cPt3dr & aC);

bool HasImageAndDepth() const override; // true
cPt3dr Ground2ImageAndDepth(const cPt3dr &) const override;
Expand Down Expand Up @@ -523,6 +525,7 @@ class cSensorCamPC : public cSensorImage

// different accessor to the pose
const tPose & Pose() const;
const tRotR & Orient() const;
const cPt3dr & Center() const;
cPt3dr & Center() ;
cPt3dr AxeI() const;
Expand Down
3 changes: 3 additions & 0 deletions MMVII/include/MMVII_Sensor.h
Original file line number Diff line number Diff line change
Expand Up @@ -247,6 +247,9 @@ class cSensorImage : public cObj2DelAtEnd,
virtual bool IsSensorCamPC() const ;
virtual const cSensorCamPC * GetSensorCamPC() const;
virtual cSensorCamPC * GetSensorCamPC() ;
/// generete a user error
const cSensorCamPC * UserGetSensorCamPC() const;
cSensorCamPC * UserGetSensorCamPC() ;

private :

Expand Down
5 changes: 3 additions & 2 deletions MMVII/src/Appli/cSpecMMVII_Appli.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -258,10 +258,11 @@ std::vector<cSpecMMVII_Appli *> & cSpecMMVII_Appli::InternVecAll()
TheVecAll.push_back(&TheSpecAppliExtractLine);
TheVecAll.push_back(&TheSpec_CERN_ImportClino);
TheVecAll.push_back(&TheSpec_MMV2_MesIm_2_MMV1);

TheVecAll.push_back(&TheSpec_MergeMesImGCP);

TheVecAll.push_back(&TheSpec_ExifData);
TheVecAll.push_back(&TheSpec_PerturbRandomOri);


std::sort(TheVecAll.begin(),TheVecAll.end(),CmpCmd);
}

Expand Down
20 changes: 16 additions & 4 deletions MMVII/src/Sensors/SensorBases.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -446,10 +446,7 @@ void cSensorImage::TransferateCoordSys(const cSensorImage & aSI)
}
const std::string cSensorImage::TagCoordSys = "CoordinateSys";

bool cSensorImage::IsSensorCamPC() const
{
return false;
}
bool cSensorImage::IsSensorCamPC() const { return false; }
const cSensorCamPC * cSensorImage::GetSensorCamPC() const
{
MMVII_INTERNAL_ERROR("impossible required cast to cSensorCamPC");
Expand All @@ -461,6 +458,21 @@ cSensorCamPC * cSensorImage::GetSensorCamPC()
return nullptr;
}

cSensorCamPC * cSensorImage::UserGetSensorCamPC()
{
if (!IsSensorCamPC())
{
MMVII_UnclasseUsEr("Camera " + NameImage() + " was not central perspective");
}
return GetSensorCamPC();
}


const cSensorCamPC * cSensorImage::UserGetSensorCamPC() const
{
return const_cast<cSensorImage*>(this)->UserGetSensorCamPC();
}



/* ******************************************************* */
Expand Down
15 changes: 14 additions & 1 deletion MMVII/src/Sensors/cSensorCamPC.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -41,6 +41,7 @@ const cPt3dr & cPoseWithUK::Tr() const {return mPose.Tr();}
cPt3dr & cPoseWithUK::Tr() {return mPose.Tr();}



cPt3dr & cPoseWithUK::Omega() {return mOmega;}
const cPt3dr & cPoseWithUK::Omega() const {return mOmega;}

Expand Down Expand Up @@ -156,7 +157,17 @@ void cSensorCamPC::SetPose(const tPose & aPose)
mPose_WU.SetPose(aPose);
}

// void SetCenter(const cPt3dr & aC);

void cSensorCamPC::SetOrient(const tRotR & anOrient)
{
SetPose(tPose(Center(),anOrient));
}

void cSensorCamPC::SetCenter(const cPt3dr & aC)
{
SetPose(tPose(aC,Orient()));
}


#if (1)
Expand Down Expand Up @@ -307,7 +318,9 @@ const cPixelDomain & cSensorCamPC::PixelDomain() const

cPerspCamIntrCalib * cSensorCamPC::InternalCalib() const {return mInternalCalib;}

const cPt3dr & cSensorCamPC::Center() const {return mPose_WU.Tr();}
const cPt3dr & cSensorCamPC::Center() const {return mPose_WU.Tr();}
const tRotR & cSensorCamPC::Orient() const {return mPose_WU.Pose().Rot();}

const cPt3dr & cSensorCamPC::Omega() const {return mPose_WU.Omega();}
cPt3dr & cSensorCamPC::Center() {return mPose_WU.Tr();}
cPt3dr & cSensorCamPC::Omega() {return mPose_WU.Omega();}
Expand Down
109 changes: 96 additions & 13 deletions MMVII/src/Simul/PerturbRandOrient.cpp
Original file line number Diff line number Diff line change
@@ -1,12 +1,10 @@
#include "MMVII_PCSens.h"
#include "MMVII_DeclareCste.h"
#include "MMVII_BundleAdj.h"
#include "MMVII_Matrix.h"
#include "MMVII_Interpolators.h"

/**
\file cConvCalib.cpp testgit
\file PerturbRandOrient.cpp
\brief file for conversion between calibration (change format, change model) and tests
\brief file for generating random permutation
*/


Expand All @@ -22,25 +20,33 @@ namespace MMVII
class cAppli_PerturbRandomOri : public cMMVII_Appli
{
public :
typedef cIm2D<tU_INT1> tIm;

cAppli_PerturbRandomOri(const std::vector<std::string> & aVArgs,const cSpecMMVII_Appli & aSpec);
int Exe() override;
cCollecSpecArg2007 & ArgObl(cCollecSpecArg2007 & anArgObl) override ;
cCollecSpecArg2007 & ArgOpt(cCollecSpecArg2007 & anArgOpt) override ;

std::vector<std::string> Samples() const override;
private :

cPhotogrammetricProject mPhProj;
void TestPly();
private :

std::string mSpecIm;
cPhotogrammetricProject mPhProj;
std::string mSpecIm;
tREAL8 mRandOri;
tREAL8 mRandC;
std::string mPlyTest;
cTriangulation3D<tREAL4> * mTri;
std::vector<cSensorImage *> mVSI;
std::vector<tIm> mVIm;

tREAL8 mRandOri;
tREAL8 mRandC;
};

cAppli_PerturbRandomOri::cAppli_PerturbRandomOri(const std::vector<std::string> & aVArgs,const cSpecMMVII_Appli & aSpec) :
cMMVII_Appli (aVArgs,aSpec),
mPhProj (*this)
mPhProj (*this),
mTri (nullptr)
{
}

Expand All @@ -59,21 +65,98 @@ cCollecSpecArg2007 & cAppli_PerturbRandomOri::ArgOpt(cCollecSpecArg2007 & anArgO
return anArgObl
<< AOpt2007(mRandOri,"RandOri","Random perturbation on orientations")
<< AOpt2007(mRandC ,"RandC" ,"Random perturbation on center")
<< AOpt2007(mPlyTest ,"PlyTest" ,"Test ply (temporary)")
;
}

// template <class Type> void cTriangulation3D<Type>::PlyInit(const std::string & aNameFile)

void cAppli_PerturbRandomOri::TestPly()
{
if (! mTri)
return;

if (mVIm.empty())
{
for (auto aSI : mVSI)
{
mVIm.push_back(tIm::FromFile(aSI->NameImage()));
}
}

cStdStatRes aStatRes;
cCubicInterpolator aInterpol(-0.5);

for (size_t aKP=0 ; aKP<mTri->NbPts() ; aKP++)
{
cPt3df aPF = mTri->KthPts(aKP);
cPt3dr aPGround(aPF.x(),aPF.y(),aPF.z());

cComputeStdDev<tREAL8> aStdDev;
int aNbOk=0;
for (size_t aKIm=0 ; aKIm<mVSI.size() ; aKIm++)
{
if (mVSI[aKIm]->IsVisible(aPGround))
{
cDataIm2D<tU_INT1> & aDIm = mVIm[aKIm].DIm();
cPt2dr aPIm = mVSI[aKIm]->Ground2Image(aPGround);
if (aDIm.InsideInterpolator(aInterpol,aPIm))
{
aStdDev.Add(aDIm.GetValueInterpol(aInterpol,aPIm));
aNbOk++;
}
}
}
if (aNbOk>=2)
{
tREAL8 aDev = aStdDev.StdDev(1e-5);
aStatRes.Add( (aDev *aNbOk) / (aNbOk-1));
}
}
StdOut() << " Avg=" << aStatRes.Avg()
<< " Med=" << aStatRes.ErrAtProp(0.5)
<< " P80=" << aStatRes.ErrAtProp(0.8)
<< " P95=" << aStatRes.ErrAtProp(0.95)
<< "\n";
}

int cAppli_PerturbRandomOri::Exe()
{
mPhProj.FinishInit();

if (IsInit(&mPlyTest))
{
mTri = new cTriangulation3D<tREAL4>(mPlyTest);
StdOut() << "TRIII, NbPts=" << mTri->NbPts() << " NbF=" << mTri->NbFace() << "\n";
}


for (const auto & aNameIm : VectMainSet(0))
{
cSensorImage* aSI = mPhProj.ReadSensor(aNameIm,true,false);
mVSI.push_back(aSI);
}

TestPly();

for (auto aSI : mVSI)
{
if (IsInit(&mRandOri))
{
cSensorCamPC * aCamPC = aSI->UserGetSensorCamPC();
aCamPC->SetOrient( aCamPC->Orient() * tRotR::RandomRot(mRandOri) );
}
if (IsInit(&mRandC))
{
cSensorCamPC * aCamPC = aSI->UserGetSensorCamPC();
aCamPC->SetCenter(aCamPC->Center() + cPt3dr::PRandC() * mRandC);
}

mPhProj.SaveSensor(*aSI);
}
TestPly();

delete mTri;
return EXIT_SUCCESS;
}

Expand All @@ -90,9 +173,9 @@ tMMVII_UnikPApli Alloc_PerturbRandomOri(const std::vector<std::string> & aVArgs,
return tMMVII_UnikPApli(new cAppli_PerturbRandomOri(aVArgs,aSpec));
}

cSpecMMVII_Appli TheSpec_ChSysCo
cSpecMMVII_Appli TheSpec_PerturbRandomOri
(
"OriPerturbRandom",
"SimulOriPerturbRandom",
Alloc_PerturbRandomOri,
"Perturbate random de orientation (for simulations)",
{eApF::Ori,eApF::Simul},
Expand Down

0 comments on commit 5834056

Please sign in to comment.