Visual Servoing Platform version 3.7.0
Loading...
Searching...
No Matches
vpMbEdgeTracker.h
1/*
2 * ViSP, open source Visual Servoing Platform software.
3 * Copyright (C) 2005 - 2025 by Inria. All rights reserved.
4 *
5 * This software is free software; you can redistribute it and/or modify
6 * it under the terms of the GNU General Public License as published by
7 * the Free Software Foundation; either version 2 of the License, or
8 * (at your option) any later version.
9 * See the file LICENSE.txt at the root directory of this source
10 * distribution for additional information about the GNU GPL.
11 *
12 * For using ViSP with software that can not be combined with the GNU
13 * GPL, please contact Inria about acquiring a ViSP Professional
14 * Edition License.
15 *
16 * See https://visp.inria.fr for more information.
17 *
18 * This software was developed at:
19 * Inria Rennes - Bretagne Atlantique
20 * Campus Universitaire de Beaulieu
21 * 35042 Rennes Cedex
22 * France
23 *
24 * If you have questions regarding the use of this file, please contact
25 * Inria at visp@inria.fr
26 *
27 * This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
28 * WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
29 *
30 * Description:
31 * Make the complete tracking of an object by using its CAD model
32 */
33
38
39#ifndef vpMbEdgeTracker_HH
40#define vpMbEdgeTracker_HH
41
42#include <visp3/core/vpConfig.h>
43#include <visp3/core/vpPoint.h>
44#include <visp3/mbt/vpMbTracker.h>
45#include <visp3/mbt/vpMbtDistanceCircle.h>
46#include <visp3/mbt/vpMbtDistanceCylinder.h>
47#include <visp3/mbt/vpMbtDistanceLine.h>
48#include <visp3/mbt/vpMbtMeLine.h>
49#include <visp3/me/vpMe.h>
50
51#include <fstream>
52#include <iostream>
53#include <list>
54#include <vector>
55
56#if defined(VISP_HAVE_COIN3D)
57// Inventor includes
58#include <Inventor/VRMLnodes/SoVRMLCoordinate.h>
59#include <Inventor/VRMLnodes/SoVRMLGroup.h>
60#include <Inventor/VRMLnodes/SoVRMLIndexedFaceSet.h>
61#include <Inventor/VRMLnodes/SoVRMLIndexedLineSet.h>
62#include <Inventor/VRMLnodes/SoVRMLShape.h>
63#include <Inventor/actions/SoGetMatrixAction.h>
64#include <Inventor/actions/SoGetPrimitiveCountAction.h>
65#include <Inventor/actions/SoSearchAction.h>
66#include <Inventor/actions/SoToVRML2Action.h>
67#include <Inventor/actions/SoWriteAction.h>
68#include <Inventor/misc/SoChildList.h>
69#include <Inventor/nodes/SoSeparator.h>
70#endif
71
72#if defined(VISP_HAVE_OPENCV) && defined(HAVE_OPENCV_IMGPROC)
73#include <opencv2/imgproc/imgproc.hpp>
74#if (VISP_HAVE_OPENCV_VERSION < 0x050000)
75#include <opencv2/imgproc/imgproc_c.h>
76#endif
77#endif
78
80
263class VISP_EXPORT vpMbEdgeTracker : public virtual vpMbTracker
264{
265protected:
271 std::vector<std::list<vpMbtDistanceLine *> > lines;
272
274 std::vector<std::list<vpMbtDistanceCircle *> > circles;
275
277 std::vector<std::list<vpMbtDistanceCylinder *> > cylinders;
278
281 unsigned int nline;
282
285 unsigned int ncircle;
286
289 unsigned int ncylinder;
290
292 unsigned int nbvisiblepolygone;
293
297
299 std::vector<bool> scales;
300
303 std::vector<const vpImage<unsigned char> *> Ipyramid;
304
308 unsigned int scaleLevel;
309
312
335 std::vector<std::vector<double> > m_featuresToBeDisplayedEdge;
336public:
338 virtual ~vpMbEdgeTracker() VP_OVERRIDE;
339
342
343 virtual void display(const vpImage<unsigned char> &I, const vpHomogeneousMatrix &cMo, const vpCameraParameters &cam,
344 const vpColor &col, unsigned int thickness = 1, bool displayFullModel = false) VP_OVERRIDE;
345 virtual void display(const vpImage<vpRGBa> &I, const vpHomogeneousMatrix &cMo, const vpCameraParameters &cam,
346 const vpColor &col, unsigned int thickness = 1, bool displayFullModel = false) VP_OVERRIDE;
347
348 void getLline(std::list<vpMbtDistanceLine *> &linesList, unsigned int level = 0) const;
349 void getLcircle(std::list<vpMbtDistanceCircle *> &circlesList, unsigned int level = 0) const;
350 void getLcylinder(std::list<vpMbtDistanceCylinder *> &cylindersList, unsigned int level = 0) const;
351
352 virtual std::vector<std::vector<double> > getModelForDisplay(unsigned int width, unsigned int height,
353 const vpHomogeneousMatrix &cMo,
354 const vpCameraParameters &cam,
355 bool displayFullModel = false) VP_OVERRIDE;
356
363 virtual inline void getMovingEdge(vpMe &p_me) const { p_me = this->me; }
369 virtual inline vpMe getMovingEdge() const { return this->me; }
370
371 virtual unsigned int getNbPoints(unsigned int level = 0) const;
372
378 std::vector<bool> getScales() const { return scales; }
388 inline double getGoodMovingEdgesRatioThreshold() const { return percentageGdPt; }
389
390 virtual inline vpColVector getError() const VP_OVERRIDE { return m_error_edge; }
391
392 virtual inline vpColVector getRobustWeights() const VP_OVERRIDE { return m_w_edge; }
393
394 virtual void loadConfigFile(const std::string &configFile, bool verbose = true) VP_OVERRIDE;
395
396 virtual void reInitModel(const vpImage<unsigned char> &I, const std::string &cad_name, const vpHomogeneousMatrix &cMo,
397 bool verbose = false, const vpHomogeneousMatrix &T = vpHomogeneousMatrix());
398 void resetTracker() VP_OVERRIDE;
399
405 virtual void setCameraParameters(const vpCameraParameters &cam) VP_OVERRIDE
406 {
407 m_cam = cam;
408
409 for (unsigned int i = 0; i < scales.size(); i += 1) {
410 if (scales[i]) {
411 for (std::list<vpMbtDistanceLine *>::const_iterator it = lines[i].begin(); it != lines[i].end(); ++it) {
412 (*it)->setCameraParameters(m_cam);
413 }
414
415 for (std::list<vpMbtDistanceCylinder *>::const_iterator it = cylinders[i].begin(); it != cylinders[i].end();
416 ++it) {
417 (*it)->setCameraParameters(m_cam);
418 }
419
420 for (std::list<vpMbtDistanceCircle *>::const_iterator it = circles[i].begin(); it != circles[i].end(); ++it) {
421 (*it)->setCameraParameters(m_cam);
422 }
423 }
424 }
425 }
426
427 virtual void setClipping(const unsigned int &flags) VP_OVERRIDE;
428
429 virtual void setFarClippingDistance(const double &dist) VP_OVERRIDE;
430
431 virtual void setNearClippingDistance(const double &dist) VP_OVERRIDE;
432
441 virtual void setOgreVisibilityTest(const bool &v) VP_OVERRIDE
442 {
444#ifdef VISP_HAVE_OGRE
445 faces.getOgreContext()->setWindowName("MBT Edge");
446#endif
447 }
448
454 virtual void setScanLineVisibilityTest(const bool &v) VP_OVERRIDE
455 {
457
458 for (unsigned int i = 0; i < scales.size(); i += 1) {
459 if (scales[i]) {
460 for (std::list<vpMbtDistanceLine *>::const_iterator it = lines[i].begin(); it != lines[i].end(); ++it) {
461 (*it)->useScanLine = v;
462 }
463 }
464 }
465 }
466
480 void setGoodMovingEdgesRatioThreshold(double threshold) { percentageGdPt = threshold; }
481
482 void setMovingEdge(const vpMe &me);
483
484 virtual void setPose(const vpImage<unsigned char> &I, const vpHomogeneousMatrix &cdMo) VP_OVERRIDE;
485 virtual void setPose(const vpImage<vpRGBa> &I_color, const vpHomogeneousMatrix &cdMo) VP_OVERRIDE;
486
487 void setScales(const std::vector<bool> &_scales);
488
489 void setUseEdgeTracking(const std::string &name, const bool &useEdgeTracking);
490
491 virtual void track(const vpImage<unsigned char> &I) VP_OVERRIDE;
492 virtual void track(const vpImage<vpRGBa> &I) VP_OVERRIDE;
494
495protected:
498 void addCircle(const vpPoint &P1, const vpPoint &P2, const vpPoint &P3, double r, int idFace = -1,
499 const std::string &name = "");
500 void addCylinder(const vpPoint &P1, const vpPoint &P2, double r, int idFace = -1, const std::string &name = "");
501 void addLine(vpPoint &p1, vpPoint &p2, int polygon = -1, std::string name = "");
502 void addPolygon(vpMbtPolygon &p);
503
504 void cleanPyramid(std::vector<const vpImage<unsigned char> *> &_pyramid);
505 void computeProjectionError(const vpImage<unsigned char> &_I);
506
507 void computeVVS(const vpImage<unsigned char> &_I, unsigned int lvl);
508 void computeVVSFirstPhase(const vpImage<unsigned char> &I, unsigned int iter, double &count, unsigned int lvl = 0);
509 void computeVVSFirstPhaseFactor(const vpImage<unsigned char> &I, unsigned int lvl = 0);
510 void computeVVSFirstPhasePoseEstimation(unsigned int iter, bool &isoJoIdentity);
511 virtual void computeVVSInit() VP_OVERRIDE;
512 virtual void computeVVSInteractionMatrixAndResidu() VP_OVERRIDE;
513 virtual void computeVVSInteractionMatrixAndResidu(const vpImage<unsigned char> &I);
514 virtual void computeVVSWeights();
515 using vpMbTracker::computeVVSWeights;
516
517 void displayFeaturesOnImage(const vpImage<unsigned char> &I);
518 void displayFeaturesOnImage(const vpImage<vpRGBa> &I);
519 void downScale(const unsigned int _scale);
520 virtual std::vector<std::vector<double> > getFeaturesForDisplayEdge();
521 virtual void init(const vpImage<unsigned char> &I) VP_OVERRIDE;
522 virtual void initCircle(const vpPoint &p1, const vpPoint &p2, const vpPoint &p3, double radius, int idFace = 0,
523 const std::string &name = "") VP_OVERRIDE;
524 virtual void initCylinder(const vpPoint &p1, const vpPoint &p2, double radius, int idFace = 0,
525 const std::string &name = "") VP_OVERRIDE;
526 virtual void initFaceFromCorners(vpMbtPolygon &polygon) VP_OVERRIDE;
527 virtual void initFaceFromLines(vpMbtPolygon &polygon) VP_OVERRIDE;
528 unsigned int initMbtTracking(unsigned int &nberrors_lines, unsigned int &nberrors_cylinders,
529 unsigned int &nberrors_circles);
530 void initMovingEdge(const vpImage<unsigned char> &I, const vpHomogeneousMatrix &_cMo, const bool &useInitRange = true);
531 void initPyramid(const vpImage<unsigned char> &_I, std::vector<const vpImage<unsigned char> *> &_pyramid);
532 void reInitLevel(const unsigned int _lvl);
533 void reinitMovingEdge(const vpImage<unsigned char> &I, const vpHomogeneousMatrix &_cMo);
534 void removeCircle(const std::string &name);
535 void removeCylinder(const std::string &name);
536 void removeLine(const std::string &name);
537 void resetMovingEdge();
538 virtual void testTracking() VP_OVERRIDE;
539 void trackMovingEdge(const vpImage<unsigned char> &I);
540 void updateMovingEdge(const vpImage<unsigned char> &I);
541 void updateMovingEdgeWeights();
542 void upScale(const unsigned int _scale);
543 void visibleFace(const vpImage<unsigned char> &_I, const vpHomogeneousMatrix &_cMo, bool &newvisibleline);
545};
546END_VISP_NAMESPACE
547#endif
Generic class defining intrinsic camera parameters.
Implementation of column vector and the associated operations.
Class to define RGB colors available for display functionalities.
Definition vpColor.h:157
Implementation of an homogeneous matrix and operations on such kind of matrices.
Definition of the vpImage class member functions.
Definition vpImage.h:131
Implementation of a matrix and operations on matrices.
Definition vpMatrix.h:175
double getGoodMovingEdgesRatioThreshold() const
vpColVector m_errorCircles
vpColVector m_w_edge
Robust weights.
vpRobust m_robust_edge
Robust.
std::vector< std::list< vpMbtDistanceLine * > > lines
vpMe me
The moving edges parameters.
void getLcylinder(std::list< vpMbtDistanceCylinder * > &cylindersList, unsigned int level=0) const
virtual void setScanLineVisibilityTest(const bool &v) VP_OVERRIDE
vpColVector m_wLines
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
vpColVector m_error_edge
(s - s*)
unsigned int ncylinder
std::vector< std::list< vpMbtDistanceCylinder * > > cylinders
Vector of the tracked cylinders.
std::vector< std::vector< double > > m_featuresToBeDisplayedEdge
Display features.
unsigned int nbvisiblepolygone
Number of polygon (face) currently visible.
std::vector< std::list< vpMbtDistanceCircle * > > circles
Vector of the tracked circles.
void getLcircle(std::list< vpMbtDistanceCircle * > &circlesList, unsigned int level=0) const
unsigned int scaleLevel
std::vector< const vpImage< unsigned char > * > Ipyramid
vpColVector m_weightedError_edge
Weighted error.
virtual void setOgreVisibilityTest(const bool &v) VP_OVERRIDE
unsigned int ncircle
std::vector< bool > scales
Vector of scale level to use for the multi-scale tracking.
vpMatrix m_L_edge
Interaction matrix.
vpRobust m_robustCylinders
void setGoodMovingEdgesRatioThreshold(double threshold)
virtual std::vector< std::vector< double > > getModelForDisplay(unsigned int width, unsigned int height, const vpHomogeneousMatrix &cMo, const vpCameraParameters &cam, bool displayFullModel=false) VP_OVERRIDE
virtual void getMovingEdge(vpMe &p_me) const
virtual vpMe getMovingEdge() const
virtual void setCameraParameters(const vpCameraParameters &cam) VP_OVERRIDE
void getLline(std::list< vpMbtDistanceLine * > &linesList, unsigned int level=0) const
vpColVector m_wCylinders
unsigned int nbFeaturesForProjErrorComputation
Number of features used in the computation of the projection error.
vpColVector m_factor
Edge VVS variables.
virtual vpColVector getRobustWeights() const VP_OVERRIDE
vpColVector m_errorLines
std::vector< bool > getScales() const
vpColVector m_wCircles
unsigned int nline
virtual vpColVector getError() const VP_OVERRIDE
vpColVector m_errorCylinders
Main methods for a model-based tracker.
virtual void track(const vpImage< unsigned char > &I)=0
void addPolygon(const std::vector< vpPoint > &corners, int idFace=-1, const std::string &polygonName="", bool useLod=false, double minPolygonAreaThreshold=2500.0, double minLineLengthThreshold=50.0)
vpCameraParameters m_cam
The camera parameters.
vpMbHiddenFaces< vpMbtPolygon > faces
Set of faces describing the object.
virtual void setScanLineVisibilityTest(const bool &v)
virtual void setOgreVisibilityTest(const bool &v)
virtual void setPose(const vpImage< unsigned char > &I, const vpHomogeneousMatrix &cdMo)=0
virtual void setNearClippingDistance(const double &dist)
virtual void setFarClippingDistance(const double &dist)
virtual void setClipping(const unsigned int &flags)
virtual void computeVVSInit()=0
virtual void loadConfigFile(const std::string &configFile, bool verbose=true)
Manage a circle used in the model-based tracker.
Manage a cylinder used in the model-based tracker.
Manage the line of a polygon used in the model-based tracker.
Implementation of a polygon of the model used by the model-based tracker.
Definition vpMe.h:143
Class that defines a 3D point in the object frame and allows forward projection of a 3D point in the ...
Definition vpPoint.h:79
Contains an M-estimator and various influence function.
Definition vpRobust.h:84