1 #include <visp3/core/vpConfig.h>
3 #ifdef VISP_HAVE_MODULE_SENSOR
4 #include <visp3/sensor/vp1394CMUGrabber.h>
5 #include <visp3/sensor/vp1394TwoGrabber.h>
6 #include <visp3/sensor/vpFlyCaptureGrabber.h>
7 #include <visp3/sensor/vpRealSense2.h>
8 #include <visp3/sensor/vpV4l2Grabber.h>
10 #include <visp3/core/vpIoTools.h>
11 #include <visp3/core/vpXmlParserCamera.h>
12 #include <visp3/gui/vpDisplayGDI.h>
13 #include <visp3/gui/vpDisplayOpenCV.h>
14 #include <visp3/gui/vpDisplayX.h>
15 #include <visp3/io/vpImageIo.h>
16 #include <visp3/vision/vpKeyPoint.h>
18 #include <visp3/mbt/vpMbGenericTracker.h>
21 #if defined(HAVE_OPENCV_VIDEOIO)
22 #include <opencv2/videoio.hpp>
34 int main(
int argc,
char **argv)
36 #if defined(VISP_HAVE_OPENCV) && defined(HAVE_OPENCV_VIDEOIO) && \
37 (defined(VISP_HAVE_V4L2) || defined(VISP_HAVE_DC1394) || defined(VISP_HAVE_CMU1394) || \
38 defined(HAVE_OPENCV_HIGHGUI) || defined(VISP_HAVE_FLYCAPTURE) || defined(VISP_HAVE_REALSENSE2))
39 #ifdef ENABLE_VISP_NAMESPACE
44 std::string opt_modelname =
"model/teabox/teabox.cao";
47 double opt_proj_error_threshold = 30.;
48 bool opt_use_ogre =
false;
49 bool opt_use_scanline =
false;
50 bool opt_display_projection_error =
false;
51 bool opt_learn =
false;
52 bool opt_auto_init =
false;
53 std::string opt_learning_data =
"learning/data-learned.bin";
54 std::string opt_intrinsic_file =
"";
55 std::string opt_camera_name =
"";
57 for (
int i = 0; i < argc; i++) {
58 if (std::string(argv[i]) ==
"--model") {
59 opt_modelname = std::string(argv[i + 1]);
61 else if (std::string(argv[i]) ==
"--tracker") {
62 opt_tracker = atoi(argv[i + 1]);
64 else if (std::string(argv[i]) ==
"--camera_device" && i + 1 < argc) {
65 opt_device = atoi(argv[i + 1]);
67 else if (std::string(argv[i]) ==
"--max_proj_error") {
68 opt_proj_error_threshold = atof(argv[i + 1]);
70 else if (std::string(argv[i]) ==
"--use_ogre") {
73 else if (std::string(argv[i]) ==
"--use_scanline") {
74 opt_use_scanline =
true;
76 else if (std::string(argv[i]) ==
"--learn") {
79 else if (std::string(argv[i]) ==
"--learning_data" && i + 1 < argc) {
80 opt_learning_data = argv[i + 1];
82 else if (std::string(argv[i]) ==
"--auto_init") {
85 else if (std::string(argv[i]) ==
"--display_proj_error") {
86 opt_display_projection_error =
true;
88 else if (std::string(argv[i]) ==
"--intrinsic" && i + 1 < argc) {
89 opt_intrinsic_file = std::string(argv[i + 1]);
91 else if (std::string(argv[i]) ==
"--camera_name" && i + 1 < argc) {
92 opt_camera_name = std::string(argv[i + 1]);
94 else if (std::string(argv[i]) ==
"--help" || std::string(argv[i]) ==
"-h") {
96 <<
"\nUsage: " << argv[0] <<
" [--camera_device <camera device> (default: 0)]"
97 <<
" [--intrinsic <intrinsic file> (default: empty)]"
98 <<
" [--camera_name <camera name> (default: empty)]"
99 <<
" [--model <model name> (default: teabox)]"
100 <<
" [--tracker <0=egde|1=keypoint|2=hybrid> (default: 2)]"
101 <<
" [--use_ogre] [--use_scanline]"
102 <<
" [--max_proj_error <allowed projection error> (default: 30)]"
103 <<
" [--learn] [--auto_init] [--learning_data <data-learned.bin> (default: learning/data-learned.bin)]"
104 <<
" [--display_proj_error]"
105 <<
" [--help] [-h]\n"
113 if (!parentname.empty())
114 objectname = parentname +
"/" + objectname;
116 std::cout <<
"Tracker requested config files: " << objectname <<
".[init, cao]" << std::endl;
117 std::cout <<
"Tracker optional config files: " << objectname <<
".[ppm]" << std::endl;
119 std::cout <<
"Tracked features: " << std::endl;
120 std::cout <<
" Use edges : " << (opt_tracker == 0 || opt_tracker == 2) << std::endl;
121 std::cout <<
" Use klt : " << (opt_tracker == 1 || opt_tracker == 2) << std::endl;
122 std::cout <<
"Tracker options: " << std::endl;
123 std::cout <<
" Use ogre : " << opt_use_ogre << std::endl;
124 std::cout <<
" Use scanline: " << opt_use_scanline << std::endl;
125 std::cout <<
" Proj. error : " << opt_proj_error_threshold << std::endl;
126 std::cout <<
" Display proj. error: " << opt_display_projection_error << std::endl;
127 std::cout <<
"Config files: " << std::endl;
128 std::cout <<
" Config file : "
129 <<
"\"" << objectname +
".xml"
130 <<
"\"" << std::endl;
131 std::cout <<
" Model file : "
132 <<
"\"" << objectname +
".cao"
133 <<
"\"" << std::endl;
134 std::cout <<
" Init file : "
135 <<
"\"" << objectname +
".init"
136 <<
"\"" << std::endl;
137 std::cout <<
"Learning options : " << std::endl;
138 std::cout <<
" Learn : " << opt_learn << std::endl;
139 std::cout <<
" Auto init : " << opt_auto_init << std::endl;
140 std::cout <<
" Learning data: " << opt_learning_data << std::endl;
143 #if VISP_VERSION_INT > VP_VERSION_INT(3, 2, 0)
155 #if defined(VISP_HAVE_PUGIXML)
157 if (!opt_intrinsic_file.empty() && !opt_camera_name.empty()) {
167 #if defined(VISP_HAVE_V4L2)
169 std::ostringstream device;
170 device <<
"/dev/video" << opt_device;
171 std::cout <<
"Use Video 4 Linux grabber on device " << device.str() << std::endl;
175 #elif defined(VISP_HAVE_DC1394)
177 std::cout <<
"Use DC1394 grabber" << std::endl;
180 #elif defined(VISP_HAVE_CMU1394)
182 std::cout <<
"Use CMU1394 grabber" << std::endl;
185 #elif defined(VISP_HAVE_FLYCAPTURE)
187 std::cout <<
"Use FlyCapture grabber" << std::endl;
190 #elif defined(VISP_HAVE_REALSENSE2)
192 std::cout <<
"Use Realsense 2 grabber" << std::endl;
195 config.disable_stream(RS2_STREAM_DEPTH);
196 config.disable_stream(RS2_STREAM_INFRARED);
197 config.enable_stream(RS2_STREAM_COLOR, 640, 480, RS2_FORMAT_RGBA8, 30);
201 std::cout <<
"Read camera parameters from Realsense device" << std::endl;
203 #elif defined(HAVE_OPENCV_VIDEOIO)
204 std::cout <<
"Use OpenCV grabber on device " << opt_device << std::endl;
205 cv::VideoCapture g(opt_device);
207 std::cout <<
"Failed to open the camera" << std::endl;
217 #if defined(VISP_HAVE_X11)
218 display =
new vpDisplayX;
219 #elif defined(VISP_HAVE_GDI)
221 #elif defined(HAVE_OPENCV_HIGHGUI)
224 display->init(I, 100, 100,
"Model-based tracker");
227 #if defined(VISP_HAVE_V4L2) || defined(VISP_HAVE_DC1394) || defined(VISP_HAVE_CMU1394) || \
228 defined(VISP_HAVE_FLYCAPTURE) || defined(VISP_HAVE_REALSENSE2)
230 #elif defined(HAVE_OPENCV_VIDEOIO)
246 if (opt_tracker == 0)
248 #if defined(VISP_HAVE_MODULE_KLT) && defined(VISP_HAVE_OPENCV) && defined(HAVE_OPENCV_IMGPROC) && defined(HAVE_OPENCV_VIDEO)
249 else if (opt_tracker == 1)
255 #if !defined(VISP_HAVE_MODULE_KLT)
256 std::cout <<
"klt and hybrid model-based tracker are not available since visp_klt module is not available. "
257 "In CMakeGUI turn visp_klt module ON, configure and build ViSP again."
260 std::cout <<
"Hybrid tracking is impossible since OpenCV is not enabled. "
261 <<
"Install OpenCV, configure and build ViSP again to run this tutorial." << std::endl;
270 #if defined(VISP_HAVE_PUGIXML)
280 if (opt_tracker == 0 || opt_tracker == 2) {
295 #if defined(VISP_HAVE_MODULE_KLT) && defined(VISP_HAVE_OPENCV) && defined(HAVE_OPENCV_IMGPROC) && defined(HAVE_OPENCV_VIDEO)
296 if (opt_tracker == 1 || opt_tracker == 2) {
306 tracker.setKltOpencv(klt_settings);
307 tracker.setKltMaskBorder(5);
331 #if (defined(VISP_HAVE_OPENCV_NONFREE) || defined(VISP_HAVE_OPENCV_XFEATURES2D)) || \
332 (VISP_HAVE_OPENCV_VERSION >= 0x030411 && CV_MAJOR_VERSION < 4) || (VISP_HAVE_OPENCV_VERSION >= 0x040400)
333 std::string detectorName =
"SIFT";
334 std::string extractorName =
"SIFT";
335 std::string matcherName =
"BruteForce";
337 std::string detectorName =
"FAST";
338 std::string extractorName =
"ORB";
339 std::string matcherName =
"BruteForce-Hamming";
342 if (opt_learn || opt_auto_init) {
346 #if !(defined(VISP_HAVE_OPENCV_NONFREE) || defined(VISP_HAVE_OPENCV_XFEATURES2D))
347 #if (VISP_HAVE_OPENCV_VERSION < 0x030000)
348 keypoint.setDetectorParameter(
"ORB",
"nLevels", 1);
350 cv::Ptr<cv::ORB> orb_detector = keypoint.
getDetector(
"ORB").dynamicCast<cv::ORB>();
352 orb_detector->setNLevels(1);
360 std::cout <<
"Cannot enable auto detection. Learning file \"" << opt_learning_data <<
"\" doesn't exist"
367 tracker.initClick(I, objectname +
".init",
true);
370 bool learn_position =
false;
371 bool run_auto_init =
false;
373 run_auto_init =
true;
378 unsigned int learn_cpt = 0;
380 bool tracking_failed =
false;
384 #if defined(VISP_HAVE_V4L2) || defined(VISP_HAVE_DC1394) || defined(VISP_HAVE_CMU1394) || \
385 defined(VISP_HAVE_FLYCAPTURE) || defined(VISP_HAVE_REALSENSE2)
387 #elif defined(HAVE_OPENCV_VIDEOIO)
395 tracking_failed =
false;
397 std::cout <<
"Auto init succeed" << std::endl;
405 else if (tracking_failed) {
407 tracking_failed =
false;
408 tracker.initClick(I, objectname +
".init",
true);
417 run_auto_init =
false;
423 tracking_failed =
true;
425 std::cout <<
"Tracker needs to restart (tracking exception)" << std::endl;
426 run_auto_init =
true;
430 if (!tracking_failed) {
431 double proj_error = 0;
441 if (proj_error > opt_proj_error_threshold) {
442 std::cout <<
"Tracker needs to restart (projection error detected: " << proj_error <<
")" << std::endl;
444 run_auto_init =
true;
446 tracking_failed =
true;
450 if (!tracking_failed) {
463 std::stringstream ss;
464 ss <<
"Translation: " << std::setprecision(5) << pose[0] <<
" " << pose[1] <<
" " << pose[2] <<
" [m]";
467 ss <<
"Rotation tu: " << std::setprecision(4) <<
vpMath::deg(pose[3]) <<
" " <<
vpMath::deg(pose[4]) <<
" "
472 std::stringstream ss;
478 if (learn_position) {
481 std::vector<cv::KeyPoint> trainKeyPoints;
482 keypoint.
detect(I, trainKeyPoints);
485 std::vector<vpPolygon> polygons;
486 std::vector<std::vector<vpPoint> > roisPt;
487 std::pair<std::vector<vpPolygon>, std::vector<std::vector<vpPoint> > > pair = tracker.
getPolygonFaces();
488 polygons = pair.first;
489 roisPt = pair.second;
492 std::vector<cv::Point3f> points3f;
496 keypoint.
buildReference(I, trainKeyPoints, points3f,
true, learn_id++);
499 for (std::vector<cv::KeyPoint>::const_iterator it = trainKeyPoints.begin(); it != trainKeyPoints.end(); ++it) {
502 learn_position =
false;
503 std::cout <<
"Data learned" << std::endl;
506 std::stringstream ss;
511 else if (opt_auto_init)
522 learn_position =
true;
525 run_auto_init =
true;
531 if (opt_learn && learn_cpt) {
532 std::cout <<
"Save learning from " << learn_cpt <<
" images in file: " << opt_learning_data << std::endl;
541 std::cout <<
"Catch a ViSP exception: " << e << std::endl;
543 #elif defined(VISP_HAVE_OPENCV)
546 std::cout <<
"Install a 3rd party dedicated to frame grabbing (dc1394, cmu1394, v4l2, OpenCV, FlyCapture, "
547 "Realsense2), configure and build ViSP again to use this example"
552 std::cout <<
"Install OpenCV 3rd party, configure and build ViSP again to use this example" << std::endl;
Firewire cameras video capture based on CMU 1394 Digital Camera SDK.
void open(vpImage< unsigned char > &I)
Class for firewire ieee1394 video devices using libdc1394-2.x api.
void open(vpImage< unsigned char > &I)
Generic class defining intrinsic camera parameters.
void initPersProjWithoutDistortion(double px, double py, double u0, double v0)
@ perspectiveProjWithoutDistortion
Perspective projection without distortion model.
static const vpColor none
static const vpColor yellow
static const vpColor green
Display for windows using GDI (available on any windows 32 platform).
The vpDisplayOpenCV allows to display image using the OpenCV library. Thus to enable this class OpenC...
Class that defines generic functionalities for display.
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 displayCross(const vpImage< unsigned char > &I, const vpImagePoint &ip, unsigned int size, const vpColor &color, unsigned int thickness=1)
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.
const std::string & getStringMessage() const
void open(vpImage< unsigned char > &I)
Implementation of an homogeneous matrix and operations on such kind of matrices.
static void convert(const vpImage< unsigned char > &src, vpImage< vpRGBa > &dest)
Class that allows keypoints detection (and descriptors extraction) and matching thanks to OpenCV libr...
unsigned int matchPoint(const vpImage< unsigned char > &I)
void setExtractor(const vpFeatureDescriptorType &extractorType)
void loadLearningData(const std::string &filename, bool binaryMode=false, bool append=false)
void detect(const vpImage< unsigned char > &I, std::vector< cv::KeyPoint > &keyPoints, const vpRect &rectangle=vpRect())
static void compute3DForPointsInPolygons(const vpHomogeneousMatrix &cMo, const vpCameraParameters &cam, std::vector< cv::KeyPoint > &candidates, const std::vector< vpPolygon > &polygons, const std::vector< std::vector< vpPoint > > &roisPt, std::vector< cv::Point3f > &points, cv::Mat *descriptors=nullptr)
void setMatcher(const std::string &matcherName)
void saveLearningData(const std::string &filename, bool binaryMode=false, bool saveTrainingImages=true)
void setDetector(const vpFeatureDetectorType &detectorType)
unsigned int buildReference(const vpImage< unsigned char > &I)
cv::Ptr< cv::FeatureDetector > getDetector(const vpFeatureDetectorType &type) const
Wrapper for the KLT (Kanade-Lucas-Tomasi) feature tracker implemented in OpenCV. Thus to enable this ...
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 deg(double rad)
Real-time 6D object pose tracking using its CAD model.
virtual void setCameraParameters(const vpCameraParameters &camera) VP_OVERRIDE
virtual int getTrackerType() const
virtual void setOgreVisibilityTest(const bool &v) VP_OVERRIDE
virtual std::pair< std::vector< vpPolygon >, std::vector< std::vector< vpPoint > > > getPolygonFaces(bool orderPolygons=true, bool useVisibility=true, bool clipPolygon=false) VP_OVERRIDE
virtual void setProjectionErrorComputation(const bool &flag) VP_OVERRIDE
virtual void setDisplayFeatures(bool displayF) VP_OVERRIDE
virtual unsigned int getNbFeaturesEdge() const
virtual double computeCurrentProjectionError(const vpImage< unsigned char > &I, const vpHomogeneousMatrix &_cMo, const vpCameraParameters &_cam) VP_OVERRIDE
virtual void getCameraParameters(vpCameraParameters &camera) const VP_OVERRIDE
virtual void initFromPose(const vpImage< unsigned char > &I, const vpHomogeneousMatrix &cMo) VP_OVERRIDE
virtual void getPose(vpHomogeneousMatrix &cMo) const VP_OVERRIDE
virtual unsigned int getNbFeaturesKlt() const
virtual void setMovingEdge(const vpMe &me)
virtual void track(const vpImage< unsigned char > &I) VP_OVERRIDE
virtual void loadModel(const std::string &modelFile, bool verbose=false, const vpHomogeneousMatrix &T=vpHomogeneousMatrix()) VP_OVERRIDE
virtual void setTrackerType(int type)
virtual void setScanLineVisibilityTest(const bool &v) 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
virtual void loadConfigFile(const std::string &configFile, bool verbose=true) VP_OVERRIDE
virtual void setProjectionErrorDisplay(bool display) VP_OVERRIDE
virtual double getProjectionError() const
void setMu1(const double &mu_1)
void setRange(const unsigned int &range)
void setLikelihoodThresholdType(const vpLikelihoodThresholdType likelihood_threshold_type)
void setMaskNumber(const unsigned int &mask_number)
void setThreshold(const double &threshold)
void setSampleStep(const double &sample_step)
void setMaskSize(const unsigned int &mask_size)
void setMu2(const double &mu_2)
Implementation of a pose vector and operations on poses.
vpCameraParameters getCameraParameters(const rs2_stream &stream, vpCameraParameters::vpCameraParametersProjType type=vpCameraParameters::perspectiveProjWithDistortion, int index=-1) const
void acquire(vpImage< unsigned char > &grey, double *ts=nullptr)
bool open(const rs2::config &cfg=rs2::config())
Class that is a wrapper over the Video4Linux2 (V4L2) driver.
void open(vpImage< unsigned char > &I)
void setScale(unsigned scale=vpV4l2Grabber::DEFAULT_SCALE)
void setDevice(const std::string &devname)
XML parser to load and save intrinsic camera parameters.
int parse(vpCameraParameters &cam, const std::string &filename, const std::string &camera_name, const vpCameraParameters::vpCameraParametersProjType &projModel, unsigned int image_width=0, unsigned int image_height=0, bool verbose=true)
VISP_EXPORT double measureTimeMs()