4 #include <visp3/core/vpConfig.h>
6 #if defined(VISP_HAVE_REALSENSE2) && defined(VISP_HAVE_OPENCV) && defined(VISP_HAVE_NLOHMANN_JSON)
7 #include <visp3/core/vpDisplay.h>
8 #include <visp3/core/vpIoTools.h>
9 #include <visp3/gui/vpDisplayGDI.h>
10 #include <visp3/gui/vpDisplayOpenCV.h>
11 #include <visp3/gui/vpDisplayX.h>
12 #include <visp3/mbt/vpMbGenericTracker.h>
13 #include <visp3/sensor/vpRealSense2.h>
15 #include VISP_NLOHMANN_JSON(json.hpp)
16 using json = nlohmann::json;
19 int main(
int argc,
char *argv[])
21 #ifdef ENABLE_VISP_NAMESPACE
25 std::string config_file =
"";
26 std::string model =
"";
27 std::string init_file =
"";
29 double proj_error_threshold = 25;
31 for (
int i = 1; i < argc; i++) {
32 if (std::string(argv[i]) ==
"--config" && i + 1 < argc) {
33 config_file = std::string(argv[i + 1]);
35 else if (std::string(argv[i]) ==
"--model" && i + 1 < argc) {
36 model = std::string(argv[i + 1]);
38 else if (std::string(argv[i]) ==
"--init_file" && i + 1 < argc) {
39 init_file = std::string(argv[i + 1]);
41 else if (std::string(argv[i]) ==
"--proj_error_threshold" && i + 1 < argc) {
42 proj_error_threshold = std::atof(argv[i + 1]);
44 else if (std::string(argv[i]) ==
"--help" || std::string(argv[i]) ==
"-h") {
45 std::cout <<
"Usage: \n"
47 <<
"--config <settings.json>"
48 <<
" --model <object.cao>"
49 " --init_file <object.init>"
50 " [--proj_error_threshold <threshold between 0 and 90> (default: "
51 << proj_error_threshold
55 std::cout <<
"\n** How to track a 4.2 cm width cube with manual initialization:\n"
56 << argv[0] <<
"--config model/cube/rgbd-tracker.json --model model/cube/cube.cao" << std::endl;
61 std::cout <<
"Config files: " << std::endl;
62 std::cout <<
" JSON config: "
63 <<
"\"" << config_file <<
"\"" << std::endl;
64 std::cout <<
" Model: "
65 <<
"\"" << model <<
"\"" << std::endl;
66 std::cout <<
" Init file: "
67 <<
"\"" << init_file <<
"\"" << std::endl;
69 if (config_file.empty()) {
70 std::cout <<
"No JSON configuration was provided!" << std::endl;
75 int width = 640, height = 480;
78 config.enable_stream(RS2_STREAM_COLOR, width, height, RS2_FORMAT_RGBA8, fps);
79 config.enable_stream(RS2_STREAM_DEPTH, width, height, RS2_FORMAT_Z16, fps);
82 realsense.
open(config);
85 std::cout <<
"Catch an exception: " << e.
what() << std::endl;
86 std::cout <<
"Check if the Realsense camera is connected..." << std::endl;
95 std::cout <<
"Sensor internal camera parameters for color camera: " << cam_color << std::endl;
96 std::cout <<
"Sensor internal camera parameters for depth camera: " << cam_depth << std::endl;
102 std::vector<vpColVector> pointcloud;
106 std::map<std::string, vpHomogeneousMatrix> mapOfCameraTransformations;
107 std::map<std::string, const vpImage<unsigned char> *> mapOfImages;
108 std::map<std::string, std::string> mapOfInitFiles;
109 std::map<std::string, const std::vector<vpColVector> *> mapOfPointclouds;
110 std::map<std::string, unsigned int> mapOfWidths, mapOfHeights;
111 std::map<std::string, vpCameraParameters> mapOfCameraIntrinsics;
117 if (model.empty() && init_file.empty()) {
118 std::ifstream config(config_file);
119 const json j = json::parse(config);
121 if (j.contains(
"model")) {
125 std::cerr <<
"No model was provided in either JSON file or arguments" << std::endl;
129 if (init_file.empty()) {
131 init_file = (parentname.empty() ?
"" : (parentname +
"/")) +
vpIoTools::getNameWE(model) +
".init";
135 std::string color_key =
"", depth_key =
"";
137 std::cout <<
"tracker key == " << tracker_type.first << std::endl;
140 color_key = tracker_type.first;
141 mapOfImages[color_key] = &I_gray;
142 mapOfInitFiles[color_key] = init_file;
143 mapOfWidths[color_key] = width;
144 mapOfHeights[color_key] = height;
145 mapOfCameraIntrinsics[color_key] = cam_color;
149 depth_key = tracker_type.first;
150 mapOfImages[depth_key] = &I_depth;
151 mapOfWidths[depth_key] = width;
152 mapOfHeights[depth_key] = height;
153 mapOfCameraIntrinsics[depth_key] = cam_depth;
154 mapOfCameraTransformations[depth_key] = depth_M_color;
155 mapOfPointclouds[depth_key] = &pointcloud;
158 const bool use_depth = !depth_key.empty();
159 const bool use_color = !color_key.empty();
168 std::cout <<
"Updating configuration with parameters provided by RealSense SDK..." << std::endl;
170 if (use_color && use_depth) {
174 unsigned int _posx = 100, _posy = 50;
178 #elif defined(VISP_HAVE_GDI)
180 #elif defined(HAVE_OPENCV_HIGHGUI)
184 d1.
init(I_gray, _posx, _posy,
"Color stream");
186 d2.init(I_depth, _posx + I_gray.getWidth() + 10, _posy,
"Depth stream");
189 realsense.
acquire((
unsigned char *)I_color.bitmap, (
unsigned char *)I_depth_raw.bitmap,
nullptr,
nullptr);
216 tracker.initClick(mapOfImages, mapOfInitFiles,
true);
219 std::vector<double> times_vec;
227 bool tracking_failed =
false;
230 realsense.
acquire((
unsigned char *)I_color.bitmap, (
unsigned char *)I_depth_raw.bitmap, &pointcloud,
nullptr,
nullptr);
241 if (use_color && use_depth) {
242 mapOfImages[color_key] = &I_gray;
243 mapOfPointclouds[depth_key] = &pointcloud;
244 mapOfWidths[depth_key] = width;
245 mapOfHeights[depth_key] = height;
247 else if (use_color) {
248 mapOfImages[color_key] = &I_gray;
250 else if (use_depth) {
251 mapOfPointclouds[depth_key] = &pointcloud;
256 if (use_color && use_depth) {
257 tracker.
track(mapOfImages, mapOfPointclouds, mapOfWidths, mapOfHeights);
259 else if (use_color) {
260 tracker.
track(I_gray);
262 else if (use_depth) {
263 tracker.
track(mapOfImages, mapOfPointclouds, mapOfWidths, mapOfHeights);
268 tracking_failed =
true;
275 double proj_error = 0;
284 if (proj_error > proj_error_threshold) {
285 std::cout <<
"Tracker needs to restart (projection error detected: " << proj_error <<
")" << std::endl;
289 if (!tracking_failed) {
293 if (use_color && use_depth) {
294 tracker.
display(I_gray, I_depth, cMo, depth_M_color * cMo, cam_color, cam_depth,
vpColor::red, 3);
298 else if (use_color) {
302 else if (use_depth) {
308 std::stringstream ss;
313 std::stringstream ss;
320 std::stringstream ss;
322 times_vec.push_back(loop_t);
323 ss <<
"Loop time: " << loop_t <<
" ms";
351 std::cout <<
"Caught an exception: " << e.
what() << std::endl;
354 if (!times_vec.empty()) {
362 #elif defined(VISP_HAVE_REALSENSE2) && defined(VISP_HAVE_OPENCV)
365 std::cout <<
"Install the JSON 3rd party library (Nlohmann JSON), reconfigure VISP and build again" << std::endl;
368 #elif defined(VISP_HAVE_REALSENSE2) && defined(VISP_HAVE_NLOHMANN_JSON)
371 std::cout <<
"Install OpenCV, reconfigure VISP and build again" << std::endl;
377 std::cout <<
"Install librealsense2 3rd party, configure and build ViSP again to use this example" << std::endl;
unsigned int size() const
Return the number of elements of the 2D array.
Generic class defining intrinsic camera parameters.
@ perspectiveProjWithoutDistortion
Perspective projection without distortion model.
static const vpColor none
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...
void init(vpImage< unsigned char > &I, int winx=-1, int winy=-1, const std::string &title="") VP_OVERRIDE
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.
const std::string & getStringMessage() const
const char * what() const
Implementation of an homogeneous matrix and operations on such kind of matrices.
static void createDepthHistogram(const vpImage< uint16_t > &src_depth, vpImage< vpRGBa > &dest_rgba)
static void convert(const vpImage< unsigned char > &src, vpImage< vpRGBa > &dest)
static double getMedian(const std::vector< double > &v)
static double getStdev(const std::vector< double > &v, bool useBesselCorrection=false)
static double getMean(const std::vector< double > &v)
Real-time 6D object pose tracking using its CAD model.
virtual void setCameraParameters(const vpCameraParameters &camera) VP_OVERRIDE
virtual int getTrackerType() const
virtual void setProjectionErrorComputation(const bool &flag) VP_OVERRIDE
virtual void setDisplayFeatures(bool displayF) VP_OVERRIDE
virtual vpColVector getError() const 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 getPose(vpHomogeneousMatrix &cMo) const VP_OVERRIDE
virtual std::map< std::string, int > getCameraTrackerTypes() const
virtual unsigned int getNbFeaturesKlt() const
virtual void track(const vpImage< unsigned char > &I) VP_OVERRIDE
virtual unsigned int getNbFeaturesDepthDense() const
virtual void loadModel(const std::string &modelFile, bool verbose=false, const vpHomogeneousMatrix &T=vpHomogeneousMatrix()) VP_OVERRIDE
virtual unsigned int getNbFeaturesDepthNormal() const
virtual unsigned int getNbPolygon() const VP_OVERRIDE
virtual void setCameraTransformationMatrix(const std::string &cameraName, const vpHomogeneousMatrix &cameraTransformationMatrix)
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 double getProjectionError() const
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())
vpHomogeneousMatrix getTransformation(const rs2_stream &from, const rs2_stream &to, int from_index=-1) const
VISP_EXPORT double measureTimeMs()