@ -12,18 +12,16 @@ namespace cv
class Odometry : : Impl
{
private :
public :
Impl ( ) { } ;
virtual ~ Impl ( ) { } ;
virtual OdometryFrame createOdometryFrame ( ) const = 0 ;
virtual void prepareFrame ( OdometryFrame & frame ) = 0 ;
virtual void prepareFrames ( OdometryFrame & srcFrame , OdometryFrame & dstFrame ) = 0 ;
virtual void prepareFrame ( OdometryFrame & frame ) const = 0 ;
virtual void prepareFrames ( OdometryFrame & srcFrame , OdometryFrame & dstFrame ) const = 0 ;
virtual bool compute ( const OdometryFrame & srcFrame , const OdometryFrame & dstFrame , OutputArray Rt ) const = 0 ;
virtual bool compute ( InputArray srcFrame , InputArray dstFrame , OutputArray Rt ) const = 0 ;
virtual bool compute ( InputArray srcDepthFrame , InputArray srcRGBFrame ,
InputArray dstDepthFrame , InputArray dstRGBFrame , OutputArray Rt ) const = 0 ;
virtual Ptr < RgbdNormals > getNormalsComputer ( ) const = 0 ;
} ;
@ -32,47 +30,36 @@ class OdometryICP : public Odometry::Impl
private :
OdometrySettings settings ;
OdometryAlgoType algtype ;
mutable Ptr < RgbdNormals > normalsComputer ;
public :
OdometryICP ( OdometrySettings settings , OdometryAlgoType algtype ) ;
~ OdometryICP ( ) ;
OdometryICP ( OdometrySettings _settings , OdometryAlgoType _algtype ) :
settings ( _settings ) , algtype ( _algtype ) , normalsComputer ( )
{ }
~ OdometryICP ( ) { }
virtual OdometryFrame createOdometryFrame ( ) const override ;
virtual void prepareFrame ( OdometryFrame & frame ) override ;
virtual void prepareFrames ( OdometryFrame & srcFrame , OdometryFrame & dstFrame ) override ;
virtual void prepareFrame ( OdometryFrame & frame ) const override ;
virtual void prepareFrames ( OdometryFrame & srcFrame , OdometryFrame & dstFrame ) const override ;
virtual bool compute ( const OdometryFrame & srcFrame , const OdometryFrame & dstFrame , OutputArray Rt ) const override ;
virtual bool compute ( InputArray srcFrame , InputArray dstFrame , OutputArray Rt ) const override ;
virtual bool compute ( InputArray srcDepthFrame , InputArray srcRGBFrame ,
InputArray dstDepthFrame , InputArray dstRGBFrame , OutputArray Rt ) const override ;
virtual Ptr < RgbdNormals > getNormalsComputer ( ) const override ;
} ;
OdometryICP : : OdometryICP ( OdometrySettings _settings , OdometryAlgoType _algtype )
{
this - > settings = _settings ;
this - > algtype = _algtype ;
}
OdometryICP : : ~ OdometryICP ( )
Ptr < RgbdNormals > OdometryICP : : getNormalsComputer ( ) const
{
return this - > normalsComputer ;
}
OdometryFrame OdometryICP : : createOdometryFrame ( ) const
void OdometryICP : : prepareFrame ( OdometryFrame & frame ) const
{
# ifdef HAVE_OPENCL
return OdometryFrame ( OdometryFrameStoreType : : UMAT ) ;
# else
return OdometryFrame ( OdometryFrameStoreType : : MAT ) ;
# endif
prepareICPFrame ( frame , frame , this - > normalsComputer , this - > settings , this - > algtype ) ;
}
void OdometryICP : : prepareFrame ( OdometryFrame & frame )
void OdometryICP : : prepareFrames ( OdometryFrame & srcFrame , OdometryFrame & dstFrame ) const
{
prepareICPFrame ( frame , frame , this - > settings , this - > algtype ) ;
}
void OdometryICP : : prepareFrames ( OdometryFrame & srcFrame , OdometryFrame & dstFrame )
{
prepareICPFrame ( srcFrame , dstFrame , this - > settings , this - > algtype ) ;
prepareICPFrame ( srcFrame , dstFrame , this - > normalsComputer , this - > settings , this - > algtype ) ;
}
bool OdometryICP : : compute ( const OdometryFrame & srcFrame , const OdometryFrame & dstFrame , OutputArray Rt ) const
@ -92,22 +79,26 @@ bool OdometryICP::compute(const OdometryFrame& srcFrame, const OdometryFrame& ds
return isCorrect ;
}
bool OdometryICP : : compute ( InputArray _srcFrame , InputArray _dstFrame , OutputArray Rt ) const
bool OdometryICP : : compute ( InputArray _srcDepth , InputArray _dstDepth , OutputArray Rt ) const
{
OdometryFrame srcFrame = this - > createOdometryFrame ( ) ;
OdometryFrame dstFrame = this - > createOdometryFrame ( ) ;
srcFrame . setDepth ( _srcFrame ) ;
dstFrame . setDepth ( _dstFrame ) ;
OdometryFrame srcFrame ( noArray ( ) , _srcDepth ) ;
OdometryFrame dstFrame ( noArray ( ) , _dstDepth ) ;
prepareICPFrame ( srcFrame , dstFrame , this - > settings , this - > algtype ) ;
prepareICPFrame ( srcFrame , dstFrame , this - > normalsComputer , this - > settings , this - > algtype ) ;
bool isCorrect = compute ( srcFrame , dstFrame , Rt ) ;
return isCorrect ;
}
bool OdometryICP : : compute ( InputArray , InputArray , InputArray , InputArray , OutputArray ) const
bool OdometryICP : : compute ( InputArray srcDepthFrame , InputArray srcRGBFrame ,
InputArray dstDepthFrame , InputArray dstRGBFrame , OutputArray Rt ) const
{
CV_Error ( cv : : Error : : StsBadFunc , " This odometry does not work with depth and rgb data simultaneously " ) ;
CV_UNUSED ( srcDepthFrame ) ;
CV_UNUSED ( srcRGBFrame ) ;
CV_UNUSED ( dstDepthFrame ) ;
CV_UNUSED ( dstRGBFrame ) ;
CV_UNUSED ( Rt ) ;
CV_Error ( cv : : Error : : StsBadFunc , " This odometry does not work with rgb data " ) ;
}
class OdometryRGB : public Odometry : : Impl
@ -117,41 +108,27 @@ private:
OdometryAlgoType algtype ;
public :
OdometryRGB ( OdometrySettings settings , OdometryAlgoType algtype ) ;
~ OdometryRGB ( ) ;
OdometryRGB ( OdometrySettings _ settings, OdometryAlgoType _algtype ) : settings ( _settings ) , algtype ( _algtype ) { }
~ OdometryRGB ( ) { }
virtual OdometryFrame createOdometryFrame ( ) const override ;
virtual void prepareFrame ( OdometryFrame & frame ) override ;
virtual void prepareFrames ( OdometryFrame & srcFrame , OdometryFrame & dstFrame ) override ;
virtual void prepareFrame ( OdometryFrame & frame ) const override ;
virtual void prepareFrames ( OdometryFrame & srcFrame , OdometryFrame & dstFrame ) const override ;
virtual bool compute ( const OdometryFrame & srcFrame , const OdometryFrame & dstFrame , OutputArray Rt ) const override ;
virtual bool compute ( InputArray srcFrame , InputArray dstFrame , OutputArray Rt ) const override ;
virtual bool compute ( InputArray srcDepthFrame , InputArray srcRGBFrame ,
InputArray dstDepthFrame , InputArray dstRGBFrame , OutputArray Rt ) const override ;
virtual Ptr < RgbdNormals > getNormalsComputer ( ) const override { return Ptr < RgbdNormals > ( ) ; }
} ;
OdometryRGB : : OdometryRGB ( OdometrySettings _settings , OdometryAlgoType _algtype )
{
this - > settings = _settings ;
this - > algtype = _algtype ;
}
OdometryRGB : : ~ OdometryRGB ( )
{
}
OdometryFrame OdometryRGB : : createOdometryFrame ( ) const
{
return OdometryFrame ( OdometryFrameStoreType : : MAT ) ;
}
void OdometryRGB : : prepareFrame ( OdometryFrame & frame )
void OdometryRGB : : prepareFrame ( OdometryFrame & frame ) const
{
prepareRGBFrame ( frame , frame , this - > settings , false ) ;
prepareRGBFrame ( frame , frame , this - > settings ) ;
}
void OdometryRGB : : prepareFrames ( OdometryFrame & srcFrame , OdometryFrame & dstFrame )
void OdometryRGB : : prepareFrames ( OdometryFrame & srcFrame , OdometryFrame & dstFrame ) const
{
prepareRGBFrame ( srcFrame , dstFrame , this - > settings , false ) ;
prepareRGBFrame ( srcFrame , dstFrame , this - > settings ) ;
}
bool OdometryRGB : : compute ( const OdometryFrame & srcFrame , const OdometryFrame & dstFrame , OutputArray Rt ) const
@ -172,22 +149,22 @@ bool OdometryRGB::compute(const OdometryFrame& srcFrame, const OdometryFrame& ds
return isCorrect ;
}
bool OdometryRGB : : compute ( InputArray _srcFrame , InputArray _dstFram e , OutputArray Rt ) const
bool OdometryRGB : : compute ( InputArray _srcImage , InputArray _dstImag e , OutputArray Rt ) const
{
OdometryFrame srcFrame = this - > createOdometryFrame ( ) ;
OdometryFrame dstFrame = this - > createOdometryFrame ( ) ;
srcFrame . setImage ( _srcFrame ) ;
dstFrame . setImage ( _dstFrame ) ;
prepareRGBFrame ( srcFrame , dstFrame , this - > settings , false ) ;
bool isCorrect = compute ( srcFrame , dstFrame , Rt ) ;
return isCorrect ;
CV_UNUSED ( _srcImage ) ;
CV_UNUSED ( _dstImage ) ;
CV_UNUSED ( Rt ) ;
CV_Error ( cv : : Error : : StsBadFunc , " This odometry algorithm requires depth and rgb data simultaneously " ) ;
}
bool OdometryRGB : : compute ( InputArray , InputArray , InputArray , InputArray , OutputArray ) const
bool OdometryRGB : : compute ( InputArray srcDepthFrame , InputArray srcRGBFrame , InputArray dstDepthFrame , InputArray dstRGBFrame , OutputArray Rt ) const
{
CV_Error ( cv : : Error : : StsBadFunc , " This odometry does not work with depth and rgb data simultaneously " ) ;
OdometryFrame srcFrame ( srcRGBFrame , srcDepthFrame ) ;
OdometryFrame dstFrame ( dstRGBFrame , dstDepthFrame ) ;
prepareRGBFrame ( srcFrame , dstFrame , this - > settings ) ;
return compute ( srcFrame , dstFrame , Rt ) ;
}
class OdometryRGBD : public Odometry : : Impl
@ -195,43 +172,34 @@ class OdometryRGBD : public Odometry::Impl
private :
OdometrySettings settings ;
OdometryAlgoType algtype ;
mutable Ptr < RgbdNormals > normalsComputer ;
public :
OdometryRGBD ( OdometrySettings settings , OdometryAlgoType algtype ) ;
~ OdometryRGBD ( ) ;
OdometryRGBD ( OdometrySettings _ settings, OdometryAlgoType _algtype ) : settings ( _settings ) , algtype ( _algtype ) , normalsComputer ( ) { }
~ OdometryRGBD ( ) { }
virtual OdometryFrame createOdometryFrame ( ) const override ;
virtual void prepareFrame ( OdometryFrame & frame ) override ;
virtual void prepareFrames ( OdometryFrame & srcFrame , OdometryFrame & dstFrame ) override ;
virtual void prepareFrame ( OdometryFrame & frame ) const override ;
virtual void prepareFrames ( OdometryFrame & srcFrame , OdometryFrame & dstFrame ) const override ;
virtual bool compute ( const OdometryFrame & srcFrame , const OdometryFrame & dstFrame , OutputArray Rt ) const override ;
virtual bool compute ( InputArray srcFrame , InputArray dstFrame , OutputArray Rt ) const override ;
virtual bool compute ( InputArray srcDepthFrame , InputArray srcRGBFrame ,
InputArray dstDepthFrame , InputArray dstRGBFrame , OutputArray Rt ) const override ;
virtual Ptr < RgbdNormals > getNormalsComputer ( ) const override ;
} ;
OdometryRGBD : : OdometryRGBD ( OdometrySettings _settings , OdometryAlgoType _algtype )
{
this - > settings = _settings ;
this - > algtype = _algtype ;
}
OdometryRGBD : : ~ OdometryRGBD ( )
Ptr < RgbdNormals > OdometryRGBD : : getNormalsComputer ( ) const
{
return normalsComputer ;
}
OdometryFrame OdometryRGBD : : createOdometryFrame ( ) const
void OdometryRGBD : : prepareFrame ( OdometryFrame & frame ) const
{
return OdometryFrame ( OdometryFrameStoreType : : MAT ) ;
prepareRGBDFrame ( frame , frame , this - > normalsComputer , this - > settings , this - > algtype ) ;
}
void OdometryRGBD : : prepareFrame ( OdometryFrame & frame )
void OdometryRGBD : : prepareFrames ( OdometryFrame & srcFrame , OdometryFrame & dstFrame ) const
{
prepareRGBDFrame ( frame , frame , this - > settings , this - > algtype ) ;
}
void OdometryRGBD : : prepareFrames ( OdometryFrame & srcFrame , OdometryFrame & dstFrame )
{
prepareRGBDFrame ( srcFrame , dstFrame , this - > settings , this - > algtype ) ;
prepareRGBDFrame ( srcFrame , dstFrame , this - > normalsComputer , this - > settings , this - > algtype ) ;
}
bool OdometryRGBD : : compute ( const OdometryFrame & srcFrame , const OdometryFrame & dstFrame , OutputArray Rt ) const
@ -251,26 +219,26 @@ bool OdometryRGBD::compute(const OdometryFrame& srcFrame, const OdometryFrame& d
return isCorrect ;
}
bool OdometryRGBD : : compute ( InputArray , InputArray , OutputArray ) const
bool OdometryRGBD : : compute ( InputArray srcFrame , InputArray dstFrame , OutputArray Rt ) const
{
CV_Error ( cv : : Error : : StsBadFunc , " This volume needs depth and rgb data simultaneously " ) ;
CV_UNUSED ( srcFrame ) ;
CV_UNUSED ( dstFrame ) ;
CV_UNUSED ( Rt ) ;
CV_Error ( cv : : Error : : StsBadFunc , " This odometry algorithm needs depth and rgb data simultaneously " ) ;
}
bool OdometryRGBD : : compute ( InputArray _srcDepthFrame , InputArray _srcRGBFrame ,
InputArray _dstDepthFrame , InputArray _dstRGBFrame , OutputArray Rt ) const
{
OdometryFrame srcFrame = this - > createOdometryFrame ( ) ;
OdometryFrame dstFrame = this - > createOdometryFrame ( ) ;
srcFrame . setDepth ( _srcDepthFrame ) ;
srcFrame . setImage ( _srcRGBFrame ) ;
dstFrame . setDepth ( _dstDepthFrame ) ;
dstFrame . setImage ( _dstRGBFrame ) ;
OdometryFrame srcFrame ( _srcRGBFrame , _srcDepthFrame ) ;
OdometryFrame dstFrame ( _dstRGBFrame , _dstDepthFrame ) ;
prepareRGBDFrame ( srcFrame , dstFrame , this - > settings , this - > algtype ) ;
prepareRGBDFrame ( srcFrame , dstFrame , this - > normalsComputer , this - > settings , this - > algtype ) ;
bool isCorrect = compute ( srcFrame , dstFrame , Rt ) ;
return isCorrect ;
}
Odometry : : Odometry ( )
{
OdometrySettings settings ;
@ -313,54 +281,45 @@ Odometry::Odometry(OdometryType otype, OdometrySettings settings, OdometryAlgoTy
break ;
default :
CV_Error ( Error : : StsInternal ,
" Incorrect OdometryType, you are able to use only { ICP, RGB, RGBD } " ) ;
" Incorrect OdometryType, you are able to use only { ICP, RGB, RGBD } " ) ;
break ;
}
}
Odometry : : ~ Odometry ( )
{
}
OdometryFrame Odometry : : createOdometryFrame ( ) const
{
return this - > impl - > createOdometryFrame ( ) ;
}
OdometryFrame Odometry : : createOdometryFrame ( OdometryFrameStoreType matType ) const
{
return OdometryFrame ( matType ) ;
}
void Odometry : : prepareFrame ( OdometryFrame & frame )
void Odometry : : prepareFrame ( OdometryFrame & frame ) const
{
this - > impl - > prepareFrame ( frame ) ;
}
void Odometry : : prepareFrames ( OdometryFrame & srcFrame , OdometryFrame & dstFrame )
void Odometry : : prepareFrames ( OdometryFrame & srcFrame , OdometryFrame & dstFrame ) const
{
this - > impl - > prepareFrames ( srcFrame , dstFrame ) ;
}
bool Odometry : : compute ( const OdometryFrame & srcFrame , const OdometryFrame & dstFrame , OutputArray Rt )
bool Odometry : : compute ( const OdometryFrame & srcFrame , const OdometryFrame & dstFrame , OutputArray Rt ) const
{
return this - > impl - > compute ( srcFrame , dstFrame , Rt ) ;
}
bool Odometry : : compute ( InputArray srcFrame , InputArray dstFrame , OutputArray Rt ) const
{
return this - > impl - > compute ( srcFrame , dstFrame , Rt ) ;
}
bool Odometry : : compute ( InputArray srcDepthFrame , InputArray srcRGBFrame ,
InputArray dstDepthFrame , InputArray dstRGBFrame , OutputArray Rt ) const
{
return this - > impl - > compute ( srcDepthFrame , srcRGBFrame , dstDepthFrame , dstRGBFrame , Rt ) ;
}
Ptr < RgbdNormals > Odometry : : getNormalsComputer ( ) const
{
return this - > impl - > getNormalsComputer ( ) ;
}
void warpFrame ( InputArray depth , InputArray image , InputArray mask ,