42 #include <visp3/core/vpCameraParameters.h>
43 #include <visp3/core/vpHomogeneousMatrix.h>
44 #include <visp3/core/vpPixelMeterConversion.h>
45 #include <visp3/core/vpPlane.h>
46 #include <visp3/core/vpPoint.h>
47 #include <visp3/core/vpRGBa.h>
55 #if ((__cplusplus >= 201703L) || (defined(_MSVC_LANG) && (_MSVC_LANG >= 201703L)))
60 #include <visp3/core/vpUniRand.h>
98 DEMENTHON_LAGRANGE_VIRTUAL_VS,
110 CHECK_DEGENERATE_POINTS
130 VP_EXPLICIT
vpPose(
const std::vector<vpPoint> &lP);
145 void addPoint(
const vpPoint &P);
155 void addPoints(
const std::vector<vpPoint> &lP);
259 bool coplanar(
int &coplanar_plane_type,
double *p_a =
nullptr,
double *p_b =
nullptr,
double *p_c =
nullptr,
double *p_d =
nullptr);
297 void poseLagrangePlan(
vpHomogeneousMatrix &cMo,
bool *p_isPlan =
nullptr,
double *p_a =
nullptr,
double *p_b =
nullptr,
298 double *p_c =
nullptr,
double *p_d =
nullptr);
354 void setDementhonSvThreshold(
const double &svThresh);
359 void setDistToPlaneForCoplanTest(
double d);
395 if (t > std::numeric_limits<double>::epsilon()) {
442 if (!computeCovariance) {
443 std::cout <<
"Warning: The covariance matrix has not been computed. See setCovarianceComputation() to do it." << std::endl;
445 return covarianceMatrix;
499 std::vector<vpPoint> vectorOfPoints(listP.begin(), listP.end());
500 return vectorOfPoints;
523 static bool computePlanarObjectPoseFromRGBD(
const vpImage<float> &depthMap,
const std::vector<vpImagePoint> &corners,
526 double *confidence_index =
nullptr);
560 static bool computePlanarObjectPoseFromRGBD(
const vpImage<float> &depthMap,
561 const std::vector<std::vector<vpImagePoint> > &corners,
563 const std::vector<std::vector<vpPoint> > &point3d,
565 bool coplanar_points =
true);
586 static int computeRansacIterations(
double probability,
double epsilon,
const int sampleSize = 4,
587 int maxIterations = 2000);
645 static void findMatch(std::vector<vpPoint> &p2D, std::vector<vpPoint> &p3D,
646 const unsigned int &numberOfInlierToReachAConsensus,
const double &threshold,
648 const int &maxNbTrials = 10000,
bool useParallelRansac =
true,
unsigned int nthreads = 0,
649 FuncCheckValidityPose func =
nullptr);
651 #ifdef VISP_HAVE_HOMOGRAPHY
677 #if ((__cplusplus >= 201703L) || (defined(_MSVC_LANG) && (_MSVC_LANG >= 201703L)))
693 template <
typename DataId>
695 const vpPlane &plane_in_camera_frame,
const std::map<DataId, vpPoint> &pts,
696 const std::map<DataId, vpImagePoint> &ips,
const vpCameraParameters &camera_intrinsics,
697 std::optional<vpHomogeneousMatrix> cMo_init = std::nullopt,
bool enable_vvs =
true)
699 if (cMo_init && (!enable_vvs)) {
702 "It doesn't make sense to use an initialized pose without enabling VVS to compute the pose from 4 points"));
714 for (
const auto &[ip_id, ip_unused] : ips) {
716 if (pts.find(ip_id) == end(pts)) {
718 "Cannot compute pose with points and image points which do not have the same IDs"));
722 std::vector<vpPoint> P {}, Q {};
726 for (
const auto &pt_map : pts) {
727 if (ips.find(pt_map.first) != end(ips)) {
731 const auto Z = plane_in_camera_frame.
computeZ(x, y);
738 P.emplace_back(x * Z, y * Z, Z);
747 if (!cMo.isValid()) {
763 static std::optional<vpHomogeneousMatrix> poseVirtualVSWithDepth(
const std::vector<vpPoint> &points,
793 std::vector<vpPoint> c3d;
795 bool computeCovariance;
800 unsigned int ransacNbInlierConsensus;
804 std::vector<vpPoint> ransacInliers;
806 std::vector<unsigned int> ransacInlierIndex;
808 double ransacThreshold;
811 double distToPlaneForCoplanarityTest;
816 std::vector<vpPoint> listOfPoints;
818 bool useParallelRansac;
820 int nbParallelRansacThreads;
828 class vpRansacFunctor
834 vpRansacFunctor(
const vpHomogeneousMatrix &cMo_,
unsigned int ransacNbInlierConsensus_,
const int ransacMaxTrials_,
835 double ransacThreshold_,
unsigned int initial_seed_,
bool checkDegeneratePoints_,
836 const std::vector<vpPoint> &listOfUniquePoints_, FuncCheckValidityPose func_)
837 : m_best_consensus(), m_checkDegeneratePoints(checkDegeneratePoints_), m_cMo(cMo_), m_foundSolution(false),
838 m_func(func_), m_listOfUniquePoints(listOfUniquePoints_), m_nbInliers(0), m_ransacMaxTrials(ransacMaxTrials_),
839 m_ransacNbInlierConsensus(ransacNbInlierConsensus_), m_ransacThreshold(ransacThreshold_),
840 m_uniRand(initial_seed_)
846 void operator()() { m_foundSolution = poseRansacImpl(); }
851 bool getResult()
const {
return m_foundSolution; }
856 std::vector<unsigned int> getBestConsensus()
const {
return m_best_consensus; }
866 unsigned int getNbInliers()
const {
return m_nbInliers; }
869 std::vector<unsigned int> m_best_consensus;
870 bool m_checkDegeneratePoints;
872 bool m_foundSolution;
873 FuncCheckValidityPose m_func;
874 std::vector<vpPoint> m_listOfUniquePoints;
875 unsigned int m_nbInliers;
876 int m_ransacMaxTrials;
877 unsigned int m_ransacNbInlierConsensus;
878 double m_ransacThreshold;
885 bool poseRansacImpl();
Generic class defining intrinsic camera parameters.
Implementation of column vector and the associated operations.
Class to define RGB colors available for display functionalities.
static const vpColor none
error that can be emitted by ViSP classes.
@ badValue
Used to indicate that a value is not in the allowed range.
Implementation of an homogeneous matrix and operations on such kind of matrices.
static vpHomogeneousMatrix compute3d3dTransformation(const std::vector< vpPoint > &p, const std::vector< vpPoint > &q)
Implementation of a matrix and operations on matrices.
static void convertPoint(const vpCameraParameters &cam, const double &u, const double &v, double &x, double &y)
This class defines the container for a plane geometrical structure.
double computeZ(double x, double y) const
Class that defines a 3D point in the object frame and allows forward projection of a 3D point in the ...
void set_x(double x)
Set the point x coordinate in the image plane.
void set_Z(double cZ)
Set the point cZ coordinate in the camera frame.
void set_y(double y)
Set the point y coordinate in the image plane.
Class used for pose computation from N points (pose from point only). Some of the algorithms implemen...
void setRansacMaxTrials(const int &rM)
double m_lambda
Parameters use for the virtual visual servoing approach.
void setRansacNbInliersToReachConsensus(const unsigned int &nbC)
vpMatrix getCovarianceMatrix() const
bool getUseParallelRansac() const
static std::optional< vpHomogeneousMatrix > computePlanarObjectPoseWithAtLeast3Points(const vpPlane &plane_in_camera_frame, const std::map< DataId, vpPoint > &pts, const std::map< DataId, vpImagePoint > &ips, const vpCameraParameters &camera_intrinsics, std::optional< vpHomogeneousMatrix > cMo_init=std::nullopt, bool enable_vvs=true)
vpPoseMethodType
Methods that could be used to estimate the pose from points.
void setCovarianceComputation(const bool &flag)
unsigned int npt
Number of point used in pose computation.
int getNbParallelRansacThreads() const
std::vector< vpPoint > getPoints() const
std::vector< unsigned int > getRansacInlierIndex() const
double m_dementhonSvThresh
SVD threshold use for the pseudo-inverse computation in poseDementhonPlan.
std::list< vpPoint > listP
Array of point (use here class vpPoint)
void setRansacFilterFlag(const RANSAC_FILTER_FLAGS &flag)
void setVvsIterMax(int nb)
@ PREFILTER_DEGENERATE_POINTS
@ NO_FILTER
No filter is applied.
unsigned int getRansacNbInliers() const
void setUseParallelRansac(bool use)
static std::optional< vpHomogeneousMatrix > poseVirtualVSWithDepth(const std::vector< vpPoint > &points, const vpHomogeneousMatrix &cMo)
std::vector< vpPoint > getRansacInliers() const
void setLambda(double lambda)
void setVvsEpsilon(const double eps)
void setNbParallelRansacThreads(int nb)
double residual
Residual in meter.
void setRansacThreshold(const double &t)
Class for generating random numbers with uniform probability density.