From 5834056220552c8492bed5ec6ae19d13634073d1 Mon Sep 17 00:00:00 2001 From: deseilligny Date: Wed, 15 Jan 2025 12:26:34 +0100 Subject: [PATCH] Perturb Random Orient : test ply --- MMVII/include/MMVII_DeclareAllCmd.h | 5 +- MMVII/include/MMVII_PCSens.h | 3 + MMVII/include/MMVII_Sensor.h | 3 + MMVII/src/Appli/cSpecMMVII_Appli.cpp | 5 +- MMVII/src/Sensors/SensorBases.cpp | 20 ++++- MMVII/src/Sensors/cSensorCamPC.cpp | 15 +++- MMVII/src/Simul/PerturbRandOrient.cpp | 109 +++++++++++++++++++++++--- 7 files changed, 138 insertions(+), 22 deletions(-) diff --git a/MMVII/include/MMVII_DeclareAllCmd.h b/MMVII/include/MMVII_DeclareAllCmd.h index 837c9c996..84b432685 100755 --- a/MMVII/include/MMVII_DeclareAllCmd.h +++ b/MMVII/include/MMVII_DeclareAllCmd.h @@ -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_ diff --git a/MMVII/include/MMVII_PCSens.h b/MMVII/include/MMVII_PCSens.h index e797e6861..54b2dcf3f 100755 --- a/MMVII/include/MMVII_PCSens.h +++ b/MMVII/include/MMVII_PCSens.h @@ -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; @@ -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; diff --git a/MMVII/include/MMVII_Sensor.h b/MMVII/include/MMVII_Sensor.h index 83d93a150..0483eb476 100755 --- a/MMVII/include/MMVII_Sensor.h +++ b/MMVII/include/MMVII_Sensor.h @@ -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 : diff --git a/MMVII/src/Appli/cSpecMMVII_Appli.cpp b/MMVII/src/Appli/cSpecMMVII_Appli.cpp index b19a4b933..c3d9c573a 100755 --- a/MMVII/src/Appli/cSpecMMVII_Appli.cpp +++ b/MMVII/src/Appli/cSpecMMVII_Appli.cpp @@ -258,10 +258,11 @@ std::vector & 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); } diff --git a/MMVII/src/Sensors/SensorBases.cpp b/MMVII/src/Sensors/SensorBases.cpp index 66659bc28..4d9c026f1 100644 --- a/MMVII/src/Sensors/SensorBases.cpp +++ b/MMVII/src/Sensors/SensorBases.cpp @@ -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"); @@ -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(this)->UserGetSensorCamPC(); +} + /* ******************************************************* */ diff --git a/MMVII/src/Sensors/cSensorCamPC.cpp b/MMVII/src/Sensors/cSensorCamPC.cpp index ba0e8b847..15d263a5f 100644 --- a/MMVII/src/Sensors/cSensorCamPC.cpp +++ b/MMVII/src/Sensors/cSensorCamPC.cpp @@ -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;} @@ -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) @@ -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();} diff --git a/MMVII/src/Simul/PerturbRandOrient.cpp b/MMVII/src/Simul/PerturbRandOrient.cpp index 1e60f2286..8bfb0f2bf 100644 --- a/MMVII/src/Simul/PerturbRandOrient.cpp +++ b/MMVII/src/Simul/PerturbRandOrient.cpp @@ -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 */ @@ -22,25 +20,33 @@ namespace MMVII class cAppli_PerturbRandomOri : public cMMVII_Appli { public : + typedef cIm2D tIm; + cAppli_PerturbRandomOri(const std::vector & aVArgs,const cSpecMMVII_Appli & aSpec); int Exe() override; cCollecSpecArg2007 & ArgObl(cCollecSpecArg2007 & anArgObl) override ; cCollecSpecArg2007 & ArgOpt(cCollecSpecArg2007 & anArgOpt) override ; std::vector 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 * mTri; + std::vector mVSI; + std::vector mVIm; - tREAL8 mRandOri; - tREAL8 mRandC; }; cAppli_PerturbRandomOri::cAppli_PerturbRandomOri(const std::vector & aVArgs,const cSpecMMVII_Appli & aSpec) : cMMVII_Appli (aVArgs,aSpec), - mPhProj (*this) + mPhProj (*this), + mTri (nullptr) { } @@ -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 void cTriangulation3D::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 ; aKPNbPts() ; aKP++) + { + cPt3df aPF = mTri->KthPts(aKP); + cPt3dr aPGround(aPF.x(),aPF.y(),aPF.z()); + + cComputeStdDev aStdDev; + int aNbOk=0; + for (size_t aKIm=0 ; aKImIsVisible(aPGround)) + { + cDataIm2D & 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(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; } @@ -90,9 +173,9 @@ tMMVII_UnikPApli Alloc_PerturbRandomOri(const std::vector & 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},