38 #include <visp3/core/vpConfig.h> 41 #include <pcl/point_cloud.h> 44 #include <visp3/core/vpDisplay.h> 45 #include <visp3/core/vpExponentialMap.h> 46 #include <visp3/core/vpTrackingException.h> 47 #include <visp3/mbt/vpMbDepthNormalTracker.h> 48 #include <visp3/mbt/vpMbtXmlGenericParser.h> 50 #if DEBUG_DISPLAY_DEPTH_NORMAL 51 #include <visp3/gui/vpDisplayGDI.h> 52 #include <visp3/gui/vpDisplayX.h> 57 m_depthNormalHiddenFacesDisplay(), m_depthNormalI_dummyVisibility(), m_depthNormalListOfActiveFaces(),
58 m_depthNormalListOfDesiredFeatures(), m_depthNormalFaces(), m_depthNormalPclPlaneEstimationMethod(2),
59 m_depthNormalPclPlaneEstimationRansacMaxIter(200), m_depthNormalPclPlaneEstimationRansacThreshold(0.001),
60 m_depthNormalSamplingStepX(2), m_depthNormalSamplingStepY(2), m_depthNormalUseRobust(false), m_error_depthNormal(),
61 m_L_depthNormal(), m_robust_depthNormal(), m_w_depthNormal(), m_weightedError_depthNormal()
62 #if DEBUG_DISPLAY_DEPTH_NORMAL
64 m_debugDisp_depthNormal(NULL), m_debugImage_depthNormal()
71 #if defined(VISP_HAVE_X11) && DEBUG_DISPLAY_DEPTH_NORMAL 73 #elif defined(VISP_HAVE_GDI) && DEBUG_DISPLAY_DEPTH_NORMAL 87 if (polygon.
nbpt < 3) {
110 for (
unsigned int i = 0; i < nbpt - 1; i++) {
124 pts[0] = polygon.
p[0];
125 pts[1] = polygon.
p[1];
126 pts[2] = polygon.
p[2];
136 bool changed =
false;
150 for (std::vector<vpMbtFaceDepthNormal *>::const_iterator it =
m_depthNormalFaces.begin();
160 double normRes_1 = -1;
161 unsigned int iter = 0;
173 bool isoJoIdentity_ =
true;
180 bool reStartFromLastIncrement =
false;
183 if (!reStartFromLastIncrement) {
189 if (!isoJoIdentity_) {
198 isoJoIdentity_ =
true;
205 if (isoJoIdentity_) {
219 isoJoIdentity_ =
false;
224 double num = 0.0, den = 0.0;
232 for (
unsigned int j = 0; j < 6; j++) {
244 normRes = sqrt(num / den);
270 unsigned int cpt = 0;
275 (*it)->computeInteractionMatrix(
cMo, L_face, features_face);
288 const bool displayFullModel)
292 bool changed =
false;
302 for (std::vector<vpMbtFaceDepthNormal *>::const_iterator it =
m_depthNormalFaces.begin();
305 face_normal->
display(I, cMo_, c, col, thickness, displayFullModel);
315 const bool displayFullModel)
319 bool changed =
false;
331 for (std::vector<vpMbtFaceDepthNormal *>::const_iterator it =
m_depthNormalFaces.begin();
334 face_normal->
display(I, cMo_, c, col, thickness, displayFullModel);
348 bool reInitialisation =
false;
352 #ifdef VISP_HAVE_OGRE 377 #ifdef VISP_HAVE_XML2 392 std::cout <<
" *********** Parsing XML for Mb Depth Tracker ************ " << std::endl;
393 xmlp.
parse(configFile);
395 std::cerr <<
"Exception: " << e.
what() << std::endl;
421 std::cerr <<
"You need the libXML2 to read the config file " << configFile << std::endl;
441 #if defined(VISP_HAVE_PCL) 481 #ifdef VISP_HAVE_OGRE 492 #ifdef VISP_HAVE_OGRE 503 #if defined(VISP_HAVE_PCL) 517 for (std::vector<vpMbtFaceDepthNormal *>::const_iterator it =
m_depthNormalFaces.begin();
519 (*it)->setScanLineVisibilityTest(v);
531 #if DEBUG_DISPLAY_DEPTH_NORMAL 532 if (!m_debugDisp_depthNormal->isInitialised()) {
533 m_debugImage_depthNormal.resize(point_cloud->height, point_cloud->width);
534 m_debugDisp_depthNormal->init(m_debugImage_depthNormal, 50, 0,
"Debug display normal depth tracker");
537 m_debugImage_depthNormal = 0;
538 std::vector<std::vector<vpImagePoint> > roiPts_vec;
548 #if DEBUG_DISPLAY_DEPTH_NORMAL 549 std::vector<std::vector<vpImagePoint> > roiPts_vec_;
553 #
if DEBUG_DISPLAY_DEPTH_NORMAL
555 m_debugImage_depthNormal, roiPts_vec_
561 #if DEBUG_DISPLAY_DEPTH_NORMAL 562 roiPts_vec.insert(roiPts_vec.end(), roiPts_vec_.begin(), roiPts_vec_.end());
568 #if DEBUG_DISPLAY_DEPTH_NORMAL 571 for (
size_t i = 0; i < roiPts_vec.size(); i++) {
572 if (roiPts_vec[i].empty())
575 for (
size_t j = 0; j < roiPts_vec[i].size() - 1; j++) {
578 vpDisplay::displayLine(m_debugImage_depthNormal, roiPts_vec[i][0], roiPts_vec[i][roiPts_vec[i].size() - 1],
588 const unsigned int height)
593 #if DEBUG_DISPLAY_DEPTH_NORMAL 594 if (!m_debugDisp_depthNormal->isInitialised()) {
595 m_debugImage_depthNormal.resize(height, width);
596 m_debugDisp_depthNormal->init(m_debugImage_depthNormal, 50, 0,
"Debug display normal depth tracker");
599 m_debugImage_depthNormal = 0;
600 std::vector<std::vector<vpImagePoint> > roiPts_vec;
610 #if DEBUG_DISPLAY_DEPTH_NORMAL 611 std::vector<std::vector<vpImagePoint> > roiPts_vec_;
616 #
if DEBUG_DISPLAY_DEPTH_NORMAL
618 m_debugImage_depthNormal, roiPts_vec_
624 #if DEBUG_DISPLAY_DEPTH_NORMAL 625 roiPts_vec.insert(roiPts_vec.end(), roiPts_vec_.begin(), roiPts_vec_.end());
631 #if DEBUG_DISPLAY_DEPTH_NORMAL 634 for (
size_t i = 0; i < roiPts_vec.size(); i++) {
635 if (roiPts_vec[i].empty())
638 for (
size_t j = 0; j < roiPts_vec[i].size() - 1; j++) {
641 vpDisplay::displayLine(m_debugImage_depthNormal, roiPts_vec[i][0], roiPts_vec[i][roiPts_vec[i].size() - 1],
653 for (std::vector<vpMbtFaceDepthNormal *>::const_iterator it =
m_depthNormalFaces.begin();
655 (*it)->setCameraParameters(camera);
661 for (std::vector<vpMbtFaceDepthNormal *>::const_iterator it =
m_depthNormalFaces.begin();
663 (*it)->setFaceCentroidMethod(method);
672 for (std::vector<vpMbtFaceDepthNormal *>::const_iterator it =
m_depthNormalFaces.begin();
674 (*it)->setFeatureEstimationMethod(method);
682 for (std::vector<vpMbtFaceDepthNormal *>::const_iterator it =
m_depthNormalFaces.begin();
684 (*it)->setPclPlaneEstimationMethod(method);
692 for (std::vector<vpMbtFaceDepthNormal *>::const_iterator it =
m_depthNormalFaces.begin();
694 (*it)->setPclPlaneEstimationRansacMaxIter(maxIter);
702 for (std::vector<vpMbtFaceDepthNormal *>::const_iterator it =
m_depthNormalFaces.begin();
704 (*it)->setPclPlaneEstimationRansacThreshold(thresold);
710 if (stepX == 0 || stepY == 0) {
711 std::cerr <<
"stepX and stepY must be greater than zero!" << std::endl;
740 const unsigned int height)
750 const double ,
const int ,
const std::string & )
756 const int ,
const std::string & )
bool m_computeInteraction
void setWindowName(const Ogre::String &n)
unsigned int getDepthNormalSamplingStepY() const
virtual void initFaceFromLines(vpMbtPolygon &polygon)
Implementation of a matrix and operations on matrices.
vpMbtFaceDepthNormal::vpFeatureEstimationType m_depthNormalFeatureEstimationMethod
Method to estimate the desired features.
bool computeDesiredFeatures(const vpHomogeneousMatrix &cMo, const unsigned int width, const unsigned int height, const pcl::PointCloud< pcl::PointXYZ >::ConstPtr &point_cloud, vpColVector &desired_features, const unsigned int stepX, const unsigned int stepY)
bool m_depthNormalUseRobust
If true, use Tukey robust M-Estimator.
vpColVector m_w_depthNormal
Robust weights.
bool hasFarClippingDistance() const
int getDepthNormalPclPlaneEstimationMethod() const
void display(const vpImage< unsigned char > &I, const vpHomogeneousMatrix &cMo, const vpCameraParameters &cam, const vpColor &col, const unsigned int thickness=1, const bool displayFullModel=false)
static void convert(const vpImage< unsigned char > &src, vpImage< vpRGBa > &dest)
void parse(const std::string &filename)
vpMbHiddenFaces< vpMbtPolygon > faces
Set of faces describing the object.
Implementation of an homogeneous matrix and operations on such kind of matrices.
std::string getName() const
int m_depthNormalPclPlaneEstimationRansacMaxIter
PCL RANSAC maximum number of iterations.
Display for windows using GDI (available on any windows 32 platform).
void resize(const unsigned int nrows, const unsigned int ncols, const bool flagNullify=true, const bool recopy_=true)
virtual void setDepthNormalFaceCentroidMethod(const vpMbtFaceDepthNormal::vpFaceCentroidType &method)
vpColVector m_error_depthNormal
(s - s*)
unsigned int m_clippingFlag
Flags specifying which clipping to used.
Class to define colors available for display functionnalities.
void setBackgroundSizeOgre(const unsigned int &h, const unsigned int &w)
double getFarClippingDistance() const
vpHomogeneousMatrix cMo
The current pose.
std::vector< vpColVector > m_depthNormalListOfDesiredFeatures
List of desired features.
virtual void track(const vpImage< unsigned char > &)
double getDepthNormalPclPlaneEstimationRansacThreshold() const
void setOgreShowConfigDialog(const bool showConfigDialog)
Use the X11 console to display images on unix-like OS. Thus to enable this class X11 should be instal...
virtual void resetTracker()
error that can be emited by ViSP classes.
vpPoint * p
corners in the object frame
unsigned int getRows() const
vpHomogeneousMatrix inverse() const
virtual void setDepthNormalPclPlaneEstimationMethod(const int method)
virtual void initFaceFromCorners(vpMbtPolygon &polygon)
bool useOgre
Use Ogre3d for visibility tests.
void getCameraParameters(vpCameraParameters &_cam) const
double getNearClippingDistance() const
double m_distNearClip
Distance for near clipping.
virtual void init(const vpImage< unsigned char > &I)
void addLine(vpPoint &p1, vpPoint &p2, vpMbHiddenFaces< vpMbtPolygon > *const faces, int polygon=-1, std::string name="")
virtual void initFromPose(const vpImage< unsigned char > &I, const std::string &initFile)
unsigned int setVisibleOgre(const vpImage< unsigned char > &I, const vpCameraParameters &cam, const vpHomogeneousMatrix &cMo, const double &angleAppears, const double &angleDisappears, bool &changed)
bool computeCovariance
Flag used to specify if the covariance matrix has to be computed or not.
static void flush(const vpImage< unsigned char > &I)
virtual void display(const vpImage< unsigned char > &I, const vpHomogeneousMatrix &cMo, const vpCameraParameters &cam, const vpColor &col, const unsigned int thickness=1, const bool displayFullModel=false)
bool m_useScanLine
Scan line visibility.
virtual void computeVVSInit()
double getAngleAppear() const
vpCameraParameters m_cam
Camera intrinsic parameters.
Class that defines what is a point.
vpCameraParameters cam
The camera parameters.
void computeClippedPolygons(const vpHomogeneousMatrix &cMo, const vpCameraParameters &cam)
unsigned int setVisible(const vpImage< unsigned char > &I, const vpCameraParameters &cam, const vpHomogeneousMatrix &cMo, const double &angle, bool &changed)
virtual void setPose(const vpImage< unsigned char > &I, const vpHomogeneousMatrix &cdMo)
void reInitModel(const vpImage< unsigned char > &I, const std::string &cad_name, const vpHomogeneousMatrix &cMo_, const bool verbose=false)
void setDepthNormalSamplingStepX(const unsigned int stepX)
vpColVector m_weightedError_depthNormal
Weighted error.
Parse an Xml file to extract configuration parameters of a mbtConfig object.Data parser for the model...
void initOgre(const vpCameraParameters &cam=vpCameraParameters())
double distFarClip
Distance for near clipping.
void setPclPlaneEstimationRansacThreshold(const double threshold)
virtual ~vpMbDepthNormalTracker()
vpMbtPolygon * m_polygon
Polygon defining the face.
vpAROgre * getOgreContext()
virtual void setDepthNormalSamplingStep(const unsigned int stepX, const unsigned int stepY)
void segmentPointCloud(const pcl::PointCloud< pcl::PointXYZ >::ConstPtr &point_cloud)
void insert(const vpMatrix &A, const unsigned int r, const unsigned int c)
vpMatrix oJo
The Degrees of Freedom to estimate.
unsigned int m_depthNormalSamplingStepX
Sampling step in x-direction.
Implementation of a polygon of the model used by the model-based tracker.
virtual void setDepthNormalPclPlaneEstimationRansacMaxIter(const int maxIter)
void setAngleDisappear(const double &adisappear)
double m_depthNormalPclPlaneEstimationRansacThreshold
PCL RANSAC threshold.
bool useScanLine
Use Scanline for visibility tests.
vpVelocityTwistMatrix buildFrom(const vpTranslationVector &t, const vpRotationMatrix &R)
static double sqr(double x)
static void display(const vpImage< unsigned char > &I)
double getAngleDisappear() const
bool getFovClipping() const
vpMbHiddenFaces< vpMbtPolygon > * m_hiddenFace
Pointer to the list of faces.
Generic class defining intrinsic camera parameters.
virtual void setOgreVisibilityTest(const bool &v)
unsigned int getNbPoint() const
void resize(const unsigned int h, const unsigned int w)
resize the image : Image initialization
virtual void testTracking()
double m_initialMu
Initial Mu for Levenberg Marquardt optimization loop.
double m_lambda
Gain of the virtual visual servoing stage.
virtual void computeVVSWeights(vpRobust &robust, const vpColVector &error, vpColVector &w)
vpMbtOptimizationMethod m_optimizationMethod
Optimization method used.
unsigned int getDepthNormalSamplingStepX() const
unsigned int m_depthNormalSamplingStepY
Sampling step in y-direction.
void setDepthNormalPclPlaneEstimationRansacMaxIter(const int maxIter)
double angleAppears
Angle used to detect a face appearance.
double m_distFarClip
Distance for near clipping.
unsigned int m_maxIter
Maximum number of iterations of the virtual visual servoing stage.
virtual void setScanLineVisibilityTest(const bool &v)
void setAngleAppear(const double &aappear)
const char * what() const
static double rad(double deg)
virtual void computeVVSInteractionMatrixAndResidu()
void displayFeature(const vpImage< unsigned char > &I, const vpHomogeneousMatrix &cMo, const vpCameraParameters &cam, const double scale=0.05, const unsigned int thickness=1)
void setFeatureEstimationMethod(const vpFeatureEstimationType &method)
void insert(unsigned int i, const vpColVector &v)
void addFace(vpMbtPolygon &polygon, const bool alreadyClose)
vpMatrix m_L_depthNormal
Interaction matrix.
vpRobust m_robust_depthNormal
Robust.
vpImage< unsigned char > m_depthNormalI_dummyVisibility
Dummy image used to compute the visibility.
virtual void setDepthNormalPclPlaneEstimationRansacThreshold(const double thresold)
unsigned int nbpt
Number of points used to define the polygon.
virtual void loadConfigFile(const std::string &configFile)
double m_stopCriteriaEpsilon
Epsilon threshold to stop the VVS optimization loop.
static double deg(double rad)
virtual void setOgreVisibilityTest(const bool &v)
bool displayFeatures
If true, the features are displayed.
virtual void loadModel(const char *modelFile, const bool verbose=false)
unsigned int getHeight() const
std::vector< vpMbtFaceDepthNormal * > m_depthNormalFaces
List of faces.
bool ogreShowConfigDialog
void setPclPlaneEstimationMethod(const int method)
bool hasNearClippingDistance() const
Implementation of column vector and the associated operations.
int m_depthNormalPclPlaneEstimationMethod
PCL plane estimation method.
virtual void computeVVSPoseEstimation(const bool isoJoIdentity_, const 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=NULL, vpColVector *const m_w_prev=NULL)
std::vector< vpMbtFaceDepthNormal * > m_depthNormalListOfActiveFaces
List of current active (visible and with features extracted) faces.
static vpHomogeneousMatrix direct(const vpColVector &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)
double angleDisappears
Angle used to detect a face disappearance.
virtual void initCircle(const vpPoint &p1, const vpPoint &p2, const vpPoint &p3, const double radius, const int idFace=0, const std::string &name="")
int getDepthNormalPclPlaneEstimationRansacMaxIter() const
void setPclPlaneEstimationRansacMaxIter(const int maxIter)
void setCameraParameters(const vpCameraParameters &_cam)
virtual void setScanLineVisibilityTest(const bool &v)
virtual void setClipping(const unsigned int &flags)
void computeVisibility(const unsigned int width, const unsigned int height)
static void displayLine(const vpImage< unsigned char > &I, const vpImagePoint &ip1, const vpImagePoint &ip2, const vpColor &color, unsigned int thickness=1)
void setDepthNormalFeatureEstimationMethod(const vpMbtFaceDepthNormal::vpFeatureEstimationType &method)
This class defines the container for a plane geometrical structure.
unsigned int clippingFlag
Flags specifying which clipping to used.
virtual void setDepthNormalFeatureEstimationMethod(const vpMbtFaceDepthNormal::vpFeatureEstimationType &method)
vpPlane m_planeObject
Plane equation described in the object frame.
vpMbHiddenFaces< vpMbtPolygon > m_depthNormalHiddenFacesDisplay
Set of faces describing the object used only for display with scan line.
virtual void initCylinder(const vpPoint &p1, const vpPoint &p2, const double radius, const int idFace=0, const std::string &name="")
void setThreshold(const double noise_threshold)
void setDepthNormalPclPlaneEstimationMethod(const int method)
virtual void setFarClippingDistance(const double &dist)
void setDepthNormalPclPlaneEstimationRansacThreshold(const double threshold)
void resize(unsigned int n_data)
Resize containers for sort methods.
unsigned int getWidth() const
double distNearClip
Distance for near clipping.
void computeScanLineRender(const vpCameraParameters &cam, const unsigned int &w, const unsigned int &h)
void setDepthNormalSamplingStepY(const unsigned int stepY)
vpMbtFaceDepthNormal::vpFeatureEstimationType getDepthNormalFeatureEstimationMethod() const
virtual void computeVVSCheckLevenbergMarquardt(const unsigned int iter, vpColVector &error, const vpColVector &m_error_prev, const vpHomogeneousMatrix &cMoPrev, double &mu, bool &reStartFromLastIncrement, vpColVector *const w=NULL, const vpColVector *const m_w_prev=NULL)
virtual void setCameraParameters(const vpCameraParameters &camera)
void resize(const unsigned int i, const bool flagNullify=true)
virtual void setNearClippingDistance(const double &dist)
void computeFov(const unsigned int &w, const unsigned int &h)