Visual Servoing Platform version 3.7.0
Loading...
Searching...
No Matches
tutorial-mb-tracker-full.cpp
1
2#include <visp3/core/vpConfig.h>
3#include <visp3/core/vpIoTools.h>
4#include <visp3/gui/vpDisplayFactory.h>
5#include <visp3/io/vpImageIo.h>
7#include <visp3/mbt/vpMbEdgeKltTracker.h>
8#include <visp3/mbt/vpMbEdgeTracker.h>
10#include <visp3/io/vpVideoReader.h>
11
12int main(int argc, char **argv)
13{
14#if defined(VISP_HAVE_OPENCV) && defined(VISP_HAVE_DISPLAY)
15#ifdef ENABLE_VISP_NAMESPACE
16 using namespace VISP_NAMESPACE_NAME;
17#endif
18
19#if (VISP_CXX_STANDARD >= VISP_CXX_STANDARD_11)
20 std::shared_ptr<vpDisplay> display = vpDisplayFactory::createDisplay();
21#else
23#endif
24
25 vpMbTracker *tracker = nullptr;
26
27 try {
28 std::string opt_videoname = "teabox.mp4";
29 std::string opt_modelname = "teabox.cao";
30 int opt_tracker = 0;
31
32 for (int i = 1; i < argc; i++) {
33 if (std::string(argv[i]) == "--video" && i + 1 < argc) {
34 opt_videoname = std::string(argv[++i]);
35 }
36 else if (std::string(argv[i]) == "--model" && i + 1 < argc) {
37 opt_modelname = std::string(argv[++i]);
38 }
39 else if (std::string(argv[i]) == "--tracker" && i + 1 < argc) {
40 opt_tracker = atoi(argv[++i]);
41 }
42 else if (std::string(argv[i]) == "--help" || std::string(argv[i]) == "-h") {
43 std::cout << "\nUsage: " << argv[0]
44 << " [--video <video name>]"
45 << " [--model <model name>] "
46 << " [--tracker <0=egde|1=keypoint|2=hybrid>]"
47 << " [--help] [-h]\n"
48 << std::endl;
49#if (VISP_CXX_STANDARD < VISP_CXX_STANDARD_11)
50 if (display != nullptr) {
51 delete display;
52 }
53#endif
54 return EXIT_SUCCESS;
55 }
56 }
57 std::string parentname = vpIoTools::getParent(opt_modelname);
58 std::string objectname = vpIoTools::getNameWE(opt_modelname);
59
60 if (!parentname.empty())
61 objectname = parentname + "/" + objectname;
62
63 std::cout << "Video name: " << opt_videoname << std::endl;
64 std::cout << "Tracker requested config files: " << objectname << ".[init,"
65 << "xml,"
66 << "cao or wrl]" << std::endl;
67 std::cout << "Tracker optional config files: " << objectname << ".[ppm]" << std::endl;
68
76
78 g.setFileName(opt_videoname);
79 g.open(I);
80
81 display->init(I, 100, 100, "Model-based tracker");
82
84 if (opt_tracker == 0)
86#if defined(VISP_HAVE_OPENCV) && defined(HAVE_OPENCV_IMGPROC) && defined(HAVE_OPENCV_VIDEO)
87 else if (opt_tracker == 1)
89 else
91#else
92 else {
93 std::cout << "klt and hybrid model-based tracker are not available "
94 "since visp_klt module is missing"
95 << std::endl;
96#if (VISP_CXX_STANDARD < VISP_CXX_STANDARD_11)
97 if (display != nullptr) {
98 delete display;
99 }
100#endif
101 return EXIT_FAILURE;
102 }
103#endif
105
106 bool usexml = false;
108#if defined(VISP_HAVE_PUGIXML)
109 if (vpIoTools::checkFilename(objectname + ".xml")) {
110 tracker->loadConfigFile(objectname + ".xml");
111 usexml = true;
112 }
113#endif
115
116 if (!usexml) {
118 if (opt_tracker == 0 || opt_tracker == 2) {
120 vpMe me;
121 me.setMaskSize(5);
122 me.setMaskNumber(180);
123 me.setRange(8);
125 me.setThreshold(20);
126 me.setMu1(0.5);
127 me.setMu2(0.5);
128 me.setSampleStep(4);
129 dynamic_cast<vpMbEdgeTracker *>(tracker)->setMovingEdge(me);
131 }
132
133#if defined(VISP_HAVE_OPENCV) && defined(HAVE_OPENCV_IMGPROC) && defined(HAVE_OPENCV_VIDEO)
134 if (opt_tracker == 1 || opt_tracker == 2) {
136 vpKltOpencv klt_settings;
137 klt_settings.setMaxFeatures(300);
138 klt_settings.setWindowSize(5);
139 klt_settings.setQuality(0.015);
140 klt_settings.setMinDistance(8);
141 klt_settings.setHarrisFreeParameter(0.01);
142 klt_settings.setBlockSize(3);
143 klt_settings.setPyramidLevels(3);
144 dynamic_cast<vpMbKltTracker *>(tracker)->setKltOpencv(klt_settings);
145 dynamic_cast<vpMbKltTracker *>(tracker)->setKltMaskBorder(5);
147 }
148#endif
149
151 cam.initPersProjWithoutDistortion(839.21470, 839.44555, 325.66776, 243.69727);
152 tracker->setCameraParameters(cam);
154
156 tracker->setAngleAppear(vpMath::rad(70));
157 tracker->setAngleDisappear(vpMath::rad(80));
160 tracker->setNearClippingDistance(0.1);
161 tracker->setFarClippingDistance(100.0);
164 tracker->setClipping(tracker->getClipping() | vpMbtPolygon::FOV_CLIPPING);
167 }
170 tracker->setOgreVisibilityTest(false);
171 tracker->setOgreShowConfigDialog(false);
174 tracker->setScanLineVisibilityTest(true);
177
179 if (vpIoTools::checkFilename(objectname + ".cao"))
180 tracker->loadModel(objectname + ".cao");
183 else if (vpIoTools::checkFilename(objectname + ".wrl"))
184 tracker->loadModel(objectname + ".wrl");
187 tracker->setDisplayFeatures(true);
190 tracker->initClick(I, objectname + ".init", true);
192
193 while (!g.end()) {
194 g.acquire(I);
197 tracker->track(I);
200 tracker->getPose(cMo);
203 tracker->getCameraParameters(cam);
204 tracker->display(I, cMo, cam, vpColor::red, 2);
206 vpDisplay::displayFrame(I, cMo, cam, 0.025, vpColor::none, 3);
207 vpDisplay::displayText(I, 10, 10, "A click to exit...", vpColor::red);
209
210 if (vpDisplay::getClick(I, false))
211 break;
212 }
214 }
215 catch (const vpException &e) {
216 std::cout << "Catch a ViSP exception: " << e << std::endl;
217 }
218#ifdef VISP_HAVE_OGRE
219 catch (Ogre::Exception &e) {
220 std::cout << "Catch an Ogre exception: " << e.getDescription() << std::endl;
221 }
222#endif
224#if (VISP_CXX_STANDARD < VISP_CXX_STANDARD_11)
225 if (display != nullptr) {
226 delete display;
227 }
228#endif
229 if (tracker != nullptr) {
230 delete tracker;
231 }
233#else
234 (void)argc;
235 (void)argv;
236 std::cout << "Install OpenCV and rebuild ViSP to use this example." << std::endl;
237#endif
238}
Generic class defining intrinsic camera parameters.
static const vpColor red
Definition vpColor.h:198
static const vpColor none
Definition vpColor.h:210
Class that defines generic functionalities for display.
Definition vpDisplay.h:171
static bool getClick(const vpImage< unsigned char > &I, bool blocking=true)
static void display(const vpImage< unsigned char > &I)
static void displayFrame(const vpImage< unsigned char > &I, const vpHomogeneousMatrix &cMo, const vpCameraParameters &cam, double size, const vpColor &color=vpColor::none, unsigned int thickness=1, const vpImagePoint &offset=vpImagePoint(0, 0), const std::string &frameName="", const vpColor &textColor=vpColor::black, const vpImagePoint &textOffset=vpImagePoint(15, 15))
static void flush(const vpImage< unsigned char > &I)
static void displayText(const vpImage< unsigned char > &I, const vpImagePoint &ip, const std::string &s, const vpColor &color)
error that can be emitted by ViSP classes.
Definition vpException.h:60
Implementation of an homogeneous matrix and operations on such kind of matrices.
Definition of the vpImage class member functions.
Definition vpImage.h:131
static bool checkFilename(const std::string &filename)
static std::string getNameWE(const std::string &pathname)
static std::string getParent(const std::string &pathname)
Wrapper for the KLT (Kanade-Lucas-Tomasi) feature tracker implemented in OpenCV. Thus to enable this ...
Definition vpKltOpencv.h:83
void setBlockSize(int blockSize)
void setQuality(double qualityLevel)
void setHarrisFreeParameter(double harris_k)
void setMaxFeatures(int maxCount)
void setMinDistance(double minDistance)
void setWindowSize(int winSize)
void setPyramidLevels(int pyrMaxLevel)
static double rad(double deg)
Definition vpMath.h:129
Hybrid tracker based on moving-edges and keypoints tracked using KLT tracker.
Make the complete tracking of an object by using its CAD model.
Model based tracker using only KLT.
Main methods for a model-based tracker.
Definition vpMe.h:143
void setMu1(const double &mu_1)
Definition vpMe.h:408
void setRange(const unsigned int &range)
Definition vpMe.h:438
void setLikelihoodThresholdType(const vpLikelihoodThresholdType likelihood_threshold_type)
Definition vpMe.h:531
void setMaskNumber(const unsigned int &mask_number)
Definition vpMe.cpp:555
void setThreshold(const double &threshold)
Definition vpMe.h:489
void setSampleStep(const double &sample_step)
Definition vpMe.h:445
void setMaskSize(const unsigned int &mask_size)
Definition vpMe.cpp:563
void setMu2(const double &mu_2)
Definition vpMe.h:415
@ NORMALIZED_THRESHOLD
Definition vpMe.h:154
Class that enables to manipulate easily a video file or a sequence of images. As it inherits from the...
void open(vpImage< vpRGBa > &I) VP_OVERRIDE
void setFileName(const std::string &filename)
void acquire(vpImage< vpRGBa > &I) VP_OVERRIDE
std::shared_ptr< vpDisplay > createDisplay()
Return a smart pointer vpDisplay specialization if a GUI library is available or nullptr otherwise.
vpDisplay * allocateDisplay()
Return a newly allocated vpDisplay specialization if a GUI library is available or nullptr otherwise.