36#include <visp3/core/vpConfig.h>
38#if defined(VISP_HAVE_PCL) && defined(VISP_HAVE_PCL_COMMON)
39#include <pcl/point_cloud.h>
42#include <visp3/core/vpDisplay.h>
43#include <visp3/core/vpExponentialMap.h>
44#include <visp3/core/vpTrackingException.h>
45#include <visp3/mbt/vpMbDepthDenseTracker.h>
46#include <visp3/mbt/vpMbtXmlGenericParser.h>
48#if DEBUG_DISPLAY_DEPTH_DENSE
49#include <visp3/gui/vpDisplayGDI.h>
50#include <visp3/gui/vpDisplayX.h>
61#if DEBUG_DISPLAY_DEPTH_DENSE
63 m_debugDisp_depthDense(nullptr), m_debugImage_depthDense()
67 faces.getOgreContext()->setWindowName(
"MBT Depth Dense");
70#if defined(VISP_HAVE_X11) && DEBUG_DISPLAY_DEPTH_DENSE
72#elif defined(VISP_HAVE_GDI) && DEBUG_DISPLAY_DEPTH_DENSE
102#if DEBUG_DISPLAY_DEPTH_DENSE
103 m_debugDisp_depthDense = tracker.m_debugDisp_depthDense;
104 m_debugImage_depthDense = tracker.m_debugImage_depthDense;
116#if DEBUG_DISPLAY_DEPTH_DENSE
117 delete m_debugDisp_depthDense;
123 if (polygon.
nbpt < 3) {
142 for (
unsigned int i = 0; i < nbpt - 1; i++) {
156 pts[0] = polygon.
p[0];
157 pts[1] = polygon.
p[1];
158 pts[2] = polygon.
p[2];
166 bool changed =
false;
175 faces.computeScanLineRender(
m_cam, width, height);
188 double normRes_1 = -1;
189 unsigned int iter = 0;
210 bool reStartFromLastIncrement =
false;
213 if (!reStartFromLastIncrement) {
218 if (!isoJoIdentity) {
244 isoJoIdentity =
false;
249 double num = 0.0, den = 0.0;
257 for (
unsigned int j = 0; j < 6; j++) {
269 normRes = sqrt(num / den);
298 unsigned int start_index = 0;
311 start_index += error.getRows();
322 bool displayFullModel)
324 std::vector<std::vector<double> > models =
327 for (
size_t i = 0; i < models.size(); i++) {
338 bool displayFullModel)
340 std::vector<std::vector<double> > models =
343 for (
size_t i = 0; i < models.size(); i++) {
370 bool displayFullModel)
372 std::vector<std::vector<double> > models;
376 bool changed =
false;
389 std::vector<std::vector<double> > modelLines =
391 models.insert(models.end(), modelLines.begin(), modelLines.end());
403 bool reInitialisation =
false;
409 if (!
faces.isOgreInitialised()) {
410 faces.setBackgroundSizeOgre(I.getHeight(), I.getWidth());
426 m_cam.computeFov(I.getWidth(), I.getHeight());
433#if defined(VISP_HAVE_PUGIXML)
445 std::cout <<
" *********** Parsing XML for Mb Depth Dense Tracker ************ " << std::endl;
447 xmlp.
parse(configFile);
450 std::cerr <<
"Exception: " << e.what() << std::endl;
494#if defined(VISP_HAVE_PCL) && defined(VISP_HAVE_PCL_COMMON)
512 normal_face =
nullptr;
547 (*it)->setCameraParameters(cam);
555 (*it)->setDepthDenseFilteringMaxDistance(maxDistance);
563 (*it)->setDepthDenseFilteringMethod(method);
571 (*it)->setDepthDenseFilteringMinDistance(minDistance);
577 if (occupancyRatio < 0.0 || occupancyRatio > 1.0) {
578 std::cerr <<
"occupancyRatio < 0.0 || occupancyRatio > 1.0" << std::endl;
584 (*it)->setDepthDenseFilteringOccupancyRatio(occupancyRatio);
588#if defined(VISP_HAVE_PCL) && defined(VISP_HAVE_PCL_COMMON)
593#if DEBUG_DISPLAY_DEPTH_DENSE
594 if (!m_debugDisp_depthDense->isInitialised()) {
595 m_debugImage_depthDense.resize(point_cloud->height, point_cloud->width);
596 m_debugDisp_depthDense->init(m_debugImage_depthDense, 50, 0,
"Debug display dense depth tracker");
599 m_debugImage_depthDense = 0;
600 std::vector<std::vector<vpImagePoint> > roiPts_vec;
608#if DEBUG_DISPLAY_DEPTH_DENSE
609 std::vector<std::vector<vpImagePoint> > roiPts_vec_;
612#
if DEBUG_DISPLAY_DEPTH_DENSE
614 m_debugImage_depthDense, roiPts_vec_
620#if DEBUG_DISPLAY_DEPTH_DENSE
621 roiPts_vec.insert(roiPts_vec.end(), roiPts_vec_.begin(), roiPts_vec_.end());
627#if DEBUG_DISPLAY_DEPTH_DENSE
630 for (
size_t i = 0; i < roiPts_vec.size(); i++) {
631 if (roiPts_vec[i].empty())
634 for (
size_t j = 0; j < roiPts_vec[i].size() - 1; j++) {
637 vpDisplay::displayLine(m_debugImage_depthDense, roiPts_vec[i][0], roiPts_vec[i][roiPts_vec[i].size() - 1],
651#if DEBUG_DISPLAY_DEPTH_DENSE
652 if (!m_debugDisp_depthDense->isInitialised()) {
653 m_debugImage_depthDense.resize(height, width);
654 m_debugDisp_depthDense->init(m_debugImage_depthDense, 50, 0,
"Debug display dense depth tracker");
657 m_debugImage_depthDense = 0;
658 std::vector<std::vector<vpImagePoint> > roiPts_vec;
666#if DEBUG_DISPLAY_DEPTH_DENSE
667 std::vector<std::vector<vpImagePoint> > roiPts_vec_;
671#
if DEBUG_DISPLAY_DEPTH_DENSE
673 m_debugImage_depthDense, roiPts_vec_
679#if DEBUG_DISPLAY_DEPTH_DENSE
680 roiPts_vec.insert(roiPts_vec.end(), roiPts_vec_.begin(), roiPts_vec_.end());
686#if DEBUG_DISPLAY_DEPTH_DENSE
689 for (
size_t i = 0; i < roiPts_vec.size(); i++) {
690 if (roiPts_vec[i].empty())
693 for (
size_t j = 0; j < roiPts_vec[i].size() - 1; j++) {
696 vpDisplay::displayLine(m_debugImage_depthDense, roiPts_vec[i][0], roiPts_vec[i][roiPts_vec[i].size() - 1],
710#if DEBUG_DISPLAY_DEPTH_DENSE
711 if (!m_debugDisp_depthDense->isInitialised()) {
712 m_debugImage_depthDense.resize(height, width);
713 m_debugDisp_depthDense->init(m_debugImage_depthDense, 50, 0,
"Debug display dense depth tracker");
716 m_debugImage_depthDense = 0;
717 std::vector<std::vector<vpImagePoint> > roiPts_vec;
725#if DEBUG_DISPLAY_DEPTH_DENSE
726 std::vector<std::vector<vpImagePoint> > roiPts_vec_;
730#
if DEBUG_DISPLAY_DEPTH_DENSE
732 m_debugImage_depthDense, roiPts_vec_
738#if DEBUG_DISPLAY_DEPTH_DENSE
739 roiPts_vec.insert(roiPts_vec.end(), roiPts_vec_.begin(), roiPts_vec_.end());
745#if DEBUG_DISPLAY_DEPTH_DENSE
748 for (
size_t i = 0; i < roiPts_vec.size(); i++) {
749 if (roiPts_vec[i].empty())
752 for (
size_t j = 0; j < roiPts_vec[i].size() - 1; j++) {
755 vpDisplay::displayLine(m_debugImage_depthDense, roiPts_vec[i][0], roiPts_vec[i][roiPts_vec[i].size() - 1],
767 faces.getOgreContext()->setWindowName(
"MBT Depth Dense");
784#if defined(VISP_HAVE_PCL) && defined(VISP_HAVE_PCL_COMMON)
788 m_I.resize(point_cloud->height, point_cloud->width);
800 (*it)->setScanLineVisibilityTest(v);
827#if defined(VISP_HAVE_PCL) && defined(VISP_HAVE_PCL_COMMON)
848 double ,
int ,
const std::string & )
854 int ,
const std::string & )
Generic class defining intrinsic camera parameters.
void computeFov(const unsigned int &w, const unsigned int &h)
Implementation of column vector and the associated operations.
Class to define RGB colors available for display functionalities.
Display for windows using GDI (available on any windows 32 platform).
Use the X11 console to display images on unix-like OS. Thus to enable this class X11 should be instal...
static void display(const vpImage< unsigned char > &I)
static void displayLine(const vpImage< unsigned char > &I, const vpImagePoint &ip1, const vpImagePoint &ip2, const vpColor &color, unsigned int thickness=1, bool segment=true)
static void flush(const vpImage< unsigned char > &I)
error that can be emitted by ViSP classes.
static vpHomogeneousMatrix direct(const vpColVector &v)
Implementation of an homogeneous matrix and operations on such kind of matrices.
vpHomogeneousMatrix inverse() const
static void convert(const vpImage< unsigned char > &src, vpImage< vpRGBa > &dest)
Class that defines a 2D point in an image. This class is useful for image processing and stores only ...
Definition of the vpImage class member functions.
static double rad(double deg)
static double sqr(double x)
static bool equal(double x, double y, double threshold=0.001)
static double deg(double rad)
Implementation of a matrix and operations on matrices.
virtual void initFaceFromLines(vpMbtPolygon &polygon) VP_OVERRIDE
virtual void initFaceFromCorners(vpMbtPolygon &polygon) VP_OVERRIDE
void segmentPointCloud(const pcl::PointCloud< pcl::PointXYZ >::ConstPtr &point_cloud)
virtual std::vector< std::vector< double > > getModelForDisplay(unsigned int width, unsigned int height, const vpHomogeneousMatrix &cMo, const vpCameraParameters &cam, bool displayFullModel=false) VP_OVERRIDE
vpMbtTukeyEstimator< double > m_robust_depthDense
Tukey M-Estimator.
virtual void setScanLineVisibilityTest(const bool &v) VP_OVERRIDE
virtual void setDepthDenseFilteringMaxDistance(double maxDistance)
void computeVisibility(unsigned int width, unsigned int height)
virtual void setCameraParameters(const vpCameraParameters &camera) VP_OVERRIDE
vpMbDepthDenseTracker & operator=(const vpMbDepthDenseTracker &tracker)
virtual void setDepthDenseFilteringMethod(int method)
virtual void init(const vpImage< unsigned char > &I) VP_OVERRIDE
void reInitModel(const vpImage< unsigned char > &I, const std::string &cad_name, const vpHomogeneousMatrix &cMo, bool verbose=false)
vpColVector m_weightedError_depthDense
Weighted error.
unsigned int m_depthDenseSamplingStepY
Sampling step in y-direction.
virtual ~vpMbDepthDenseTracker() VP_OVERRIDE
virtual void resetTracker() VP_OVERRIDE
virtual void setPose(const vpImage< unsigned char > &I, const vpHomogeneousMatrix &cdMo) VP_OVERRIDE
vpMbHiddenFaces< vpMbtPolygon > m_depthDenseHiddenFacesDisplay
Set of faces describing the object used only for display with scan line.
virtual void testTracking() VP_OVERRIDE
virtual void display(const vpImage< unsigned char > &I, const vpHomogeneousMatrix &cMo, const vpCameraParameters &cam, const vpColor &col, unsigned int thickness=1, bool displayFullModel=false) VP_OVERRIDE
void setUseDepthDenseTracking(const std::string &name, const bool &useDepthDenseTracking)
unsigned int m_depthDenseSamplingStepX
Sampling step in x-direction.
virtual void computeVVSWeights()
vpColVector m_error_depthDense
(s - s*)
virtual void computeVVSInteractionMatrixAndResidu() VP_OVERRIDE
virtual void initCylinder(const vpPoint &p1, const vpPoint &p2, double radius, int idFace=0, const std::string &name="") VP_OVERRIDE
vpMatrix m_L_depthDense
Interaction matrix.
std::vector< vpMbtFaceDepthDense * > m_depthDenseListOfActiveFaces
List of current active (visible and features extracted) faces.
virtual void computeVVSInit() VP_OVERRIDE
virtual void track(const vpImage< unsigned char > &) VP_OVERRIDE
void setDepthDenseSamplingStep(unsigned int stepX, unsigned int stepY)
void addFace(vpMbtPolygon &polygon, bool alreadyClose)
virtual void setOgreVisibilityTest(const bool &v) VP_OVERRIDE
virtual void setDepthDenseFilteringMinDistance(double minDistance)
unsigned int m_denseDepthNbFeatures
Nb features.
vpColVector m_w_depthDense
Robust weights.
virtual void loadConfigFile(const std::string &configFile, bool verbose=true) VP_OVERRIDE
virtual void setDepthDenseFilteringOccupancyRatio(double occupancyRatio)
virtual void initCircle(const vpPoint &p1, const vpPoint &p2, const vpPoint &p3, double radius, int idFace=0, const std::string &name="") VP_OVERRIDE
std::vector< vpMbtFaceDepthDense * > m_depthDenseFaces
List of faces.
double m_lambda
Gain of the virtual visual servoing stage.
vpImage< unsigned char > m_I
Grayscale image buffer, used when passing color images.
bool m_computeInteraction
vpMatrix oJo
The Degrees of Freedom to estimate.
vpUniRand m_rand
Random number generator used in vpMbtDistanceLine::buildFrom().
double m_initialMu
Initial Mu for Levenberg Marquardt optimization loop.
vpHomogeneousMatrix m_cMo
The current pose.
virtual void computeVVSCheckLevenbergMarquardt(unsigned int iter, vpColVector &error, const vpColVector &m_error_prev, const vpHomogeneousMatrix &cMoPrev, double &mu, bool &reStartFromLastIncrement, vpColVector *const w=nullptr, const vpColVector *const m_w_prev=nullptr)
vpCameraParameters m_cam
The camera parameters.
double m_stopCriteriaEpsilon
Epsilon threshold to stop the VVS optimization loop.
bool useOgre
Use Ogre3d for global visibility tests.
vpMbHiddenFaces< vpMbtPolygon > faces
Set of faces describing the object.
virtual void setScanLineVisibilityTest(const bool &v)
virtual void setOgreVisibilityTest(const bool &v)
virtual void computeCovarianceMatrixVVS(const bool isoJoIdentity, const vpColVector &w_true, const vpHomogeneousMatrix &cMoPrev, const vpMatrix &L_true, const vpMatrix &LVJ_true, const vpColVector &error)
vpMbtOptimizationMethod m_optimizationMethod
Optimization method used.
virtual void computeVVSPoseEstimation(const bool isoJoIdentity, unsigned int iter, vpMatrix &L, vpMatrix <L, vpColVector &R, const vpColVector &error, vpColVector &error_prev, vpColVector <R, double &mu, vpColVector &v, const vpColVector *const w=nullptr, vpColVector *const m_w_prev=nullptr)
virtual void loadModel(const std::string &modelFile, bool verbose=false, const vpHomogeneousMatrix &od_M_o=vpHomogeneousMatrix())
double angleDisappears
Angle used to detect a face disappearance.
virtual void setNearClippingDistance(const double &dist)
virtual void setFarClippingDistance(const double &dist)
double distFarClip
Distance for near clipping.
bool m_isoJoIdentity
Boolean to know if oJo is identity (for fast computation).
bool useScanLine
Use Scanline for global visibility tests.
virtual void setClipping(const unsigned int &flags)
double angleAppears
Angle used to detect a face appearance.
const vpImage< bool > * m_mask
Mask used to disable tracking on a part of image.
virtual void initFromPose(const vpImage< unsigned char > &I, const std::string &initFile)
bool computeCovariance
Flag used to specify if the covariance matrix has to be computed or not.
double distNearClip
Distance for near clipping.
unsigned int m_maxIter
Maximum number of iterations of the virtual visual servoing stage.
bool ogreShowConfigDialog
unsigned int clippingFlag
Flags specifying which clipping to used.
Manage depth dense features for a particular face.
vpMbHiddenFaces< vpMbtPolygon > * m_hiddenFace
Pointer to the list of faces.
double m_distFarClip
Distance for near clipping.
vpPlane m_planeObject
Plane equation described in the object frame.
std::vector< std::vector< double > > getModelForDisplay(unsigned int width, unsigned int height, const vpHomogeneousMatrix &cMo, const vpCameraParameters &cam, bool displayFullModel=false)
unsigned int getNbFeatures() const
void setTracked(bool tracked)
void computeInteractionMatrixAndResidu(const vpHomogeneousMatrix &cMo, vpMatrix &L, vpColVector &error)
vpMbtPolygon * m_polygon
Polygon defining the face.
bool m_useScanLine
Scan line visibility.
bool computeDesiredFeatures(const vpHomogeneousMatrix &cMo, const pcl::PointCloud< pcl::PointXYZ >::ConstPtr &point_cloud, unsigned int stepX, unsigned int stepY, const vpImage< bool > *mask=nullptr)
unsigned int m_clippingFlag
Flags specifying which clipping to used.
vpCameraParameters m_cam
Camera intrinsic parameters.
double m_distNearClip
Distance for near clipping.
void addLine(vpPoint &p1, vpPoint &p2, vpMbHiddenFaces< vpMbtPolygon > *const faces, vpUniRand &rand_gen, int polygon=-1, std::string name="")
Implementation of a polygon of the model used by the model-based tracker.
std::string getName() const
Parse an Xml file to extract configuration parameters of a mbtConfig object.
void getCameraParameters(vpCameraParameters &cam) const
void setDepthDenseSamplingStepY(unsigned int stepY)
double getAngleAppear() const
void setAngleDisappear(const double &adisappear)
double getAngleDisappear() const
void setDepthDenseSamplingStepX(unsigned int stepX)
void setAngleAppear(const double &aappear)
unsigned int getDepthDenseSamplingStepY() const
void parse(const std::string &filename)
double getNearClippingDistance() const
bool hasNearClippingDistance() const
bool hasFarClippingDistance() const
unsigned int getDepthDenseSamplingStepX() const
void setCameraParameters(const vpCameraParameters &cam)
double getFarClippingDistance() const
bool getFovClipping() const
void setVerbose(bool verbose)
This class defines the container for a plane geometrical structure.
Class that defines a 3D point in the object frame and allows forward projection of a 3D point in the ...
unsigned int nbpt
Number of points used to define the polygon.
unsigned int getNbPoint() const
vpPoint * p
corners in the object frame
vpVelocityTwistMatrix & buildFrom(const vpTranslationVector &t, const vpRotationMatrix &R)