Visual Servoing Platform version 3.6.0
Loading...
Searching...
No Matches
tutorial-grabber-realsense-T265.cpp
1
2#include <visp3/core/vpImage.h>
3#include <visp3/gui/vpDisplayGDI.h>
4#include <visp3/gui/vpDisplayOpenCV.h>
5#include <visp3/gui/vpDisplayX.h>
6#include <visp3/io/vpImageStorageWorker.h>
7#include <visp3/sensor/vpRealSense2.h>
8
9void usage(const char *argv[], int error)
10{
11 std::cout << "SYNOPSIS" << std::endl
12 << " " << argv[0] << " [--fps <6|15|30|60>]"
13 << " [--record <mode>]"
14 << " [--no-display]"
15 << " [--help] [-h]" << std::endl
16 << std::endl;
17 std::cout << "DESCRIPTION" << std::endl
18 << " --fps <6|15|30|60>" << std::endl
19 << " Frames per second." << std::endl
20 << " Default: 30." << std::endl
21 << std::endl
22 << " --record <mode>" << std::endl
23 << " Allowed values for mode are:" << std::endl
24 << " 0: record all the captures images (continuous mode)," << std::endl
25 << " 1: record only images selected by a user click (single shot mode)." << std::endl
26 << " Default mode: 0" << std::endl
27 << std::endl
28 << " --no-display" << std::endl
29 << " Disable displaying captured images." << std::endl
30 << " When used and sequence name specified, record mode is internally set to 1 (continuous mode)."
31 << std::endl
32 << std::endl
33 << " --help, -h" << std::endl
34 << " Print this helper message." << std::endl
35 << std::endl;
36 std::cout << "USAGE" << std::endl
37 << " Example to visualize images:" << std::endl
38 << " " << argv[0] << std::endl
39 << std::endl
40 << " Example to record a sequence of images:" << std::endl
41 << " " << argv[0] << " --record 0" << std::endl
42 << std::endl
43 << " Example to record single shot images:\n"
44 << " " << argv[0] << " --record 1" << std::endl
45 << std::endl;
46
47 if (error) {
48 std::cout << "Error" << std::endl
49 << " "
50 << "Unsupported parameter " << argv[error] << std::endl;
51 }
52}
53
57int main(int argc, const char *argv[])
58{
59#if defined(VISP_HAVE_REALSENSE2) && (RS2_API_VERSION > ((2 * 10000) + (31 * 100) + 0)) && \
60 (VISP_CXX_STANDARD >= VISP_CXX_STANDARD_11)
61 try {
62 std::string opt_seqname_left = "left-%04d.png", opt_seqname_right = "right-%04d.png";
63 int opt_record_mode = 0;
64 int opt_fps = 30;
65 bool opt_display = true;
66
67 for (int i = 1; i < argc; i++) {
68 if (std::string(argv[i]) == "--fps") {
69 opt_fps = std::atoi(argv[i + 1]);
70 i++;
71 } else if (std::string(argv[i]) == "--record") {
72 opt_record_mode = std::atoi(argv[i + 1]);
73 i++;
74 } else if (std::string(argv[i]) == "--no-display") {
75 opt_display = false;
76 } else if (std::string(argv[i]) == "--help" || std::string(argv[i]) == "-h") {
77 usage(argv, 0);
78 return EXIT_SUCCESS;
79 } else {
80 usage(argv, i);
81 return EXIT_FAILURE;
82 }
83 }
84
85 if (!opt_display) {
86 opt_record_mode = 0;
87 }
88
89 std::cout << "Framerate : " << opt_fps << std::endl;
90 std::cout << "Display : " << (opt_display ? "enabled" : "disabled") << std::endl;
91
92 std::string text_record_mode =
93 std::string("Record mode: ") + (opt_record_mode ? std::string("single") : std::string("continuous"));
94
95 std::cout << text_record_mode << std::endl;
96 std::cout << "Left record name: " << opt_seqname_left << std::endl;
97 std::cout << "Right record name: " << opt_seqname_right << std::endl;
98
99 vpImage<unsigned char> I_left, I_right;
100
101 vpRealSense2 g;
102 rs2::config config;
103 config.enable_stream(RS2_STREAM_FISHEYE, 1);
104 config.enable_stream(RS2_STREAM_FISHEYE, 2);
105 g.open(config);
106
107 g.acquire(&I_left, &I_right);
108
109 std::cout << "Image size : " << I_left.getWidth() << " " << I_right.getHeight() << std::endl;
110
111 vpDisplay *display_left = NULL, *display_right = NULL;
112 if (opt_display) {
113#if !(defined(VISP_HAVE_X11) || defined(VISP_HAVE_GDI) || defined(VISP_HAVE_OPENCV))
114 std::cout << "No image viewer is available..." << std::endl;
115 opt_display = false;
116#endif
117 }
118 if (opt_display) {
119#ifdef VISP_HAVE_X11
120 display_left = new vpDisplayX(I_left, 10, 10, "Left image");
121 display_right = new vpDisplayX(I_right, I_left.getWidth(), 10, "Right image");
122#elif defined(VISP_HAVE_GDI)
123 display_left = new vpDisplayGDI(I_left, 10, 10, "Left image");
124 display_right = new vpDisplayGDI(I_right, I_left.getWidth(), 10, "Right image");
125#elif defined(HAVE_OPENCV_HIGHGUI)
126 display_left = new vpDisplayOpenCV(I_left, 10, 10, "Left image");
127 display_right = new vpDisplayOpenCV(I_right, I_left.getWidth(), 10, "Right image");
128#endif
129 }
130
131 vpImageQueue<unsigned char> image_queue_left(opt_seqname_left, opt_record_mode);
132 vpImageQueue<unsigned char> image_queue_right(opt_seqname_right, opt_record_mode);
133 vpImageStorageWorker<unsigned char> image_left_storage_worker(std::ref(image_queue_left));
134 vpImageStorageWorker<unsigned char> image_right_storage_worker(std::ref(image_queue_right));
135 std::thread image_left_storage_thread(&vpImageStorageWorker<unsigned char>::run, &image_left_storage_worker);
136 std::thread image_right_storage_thread(&vpImageStorageWorker<unsigned char>::run, &image_right_storage_worker);
137
138 bool quit = false;
139 while (!quit) {
140 double t = vpTime::measureTimeMs();
141
142 g.acquire(&I_left, &I_right);
143
144 vpDisplay::display(I_left);
145 vpDisplay::display(I_right);
146
147 quit = image_queue_left.record(I_left);
148 quit |= image_queue_right.record(I_right, NULL, image_queue_left.getRecordingTrigger(), true);
149
150 std::stringstream ss;
151 ss << "Acquisition time: " << std::setprecision(3) << vpTime::measureTimeMs() - t << " ms";
152 vpDisplay::displayText(I_left, I_left.getHeight() - 20, 10, ss.str(), vpColor::red);
153 vpDisplay::flush(I_left);
154 vpDisplay::flush(I_right);
155 }
156 image_queue_left.cancel();
157 image_queue_right.cancel();
158 image_left_storage_thread.join();
159 image_right_storage_thread.join();
160
161 if (display_left) {
162 delete display_left;
163 }
164 if (display_right) {
165 delete display_right;
166 }
167 } catch (const vpException &e) {
168 std::cout << "Catch an exception: " << e << std::endl;
169 }
170#else
171 (void)argc;
172 (void)argv;
173#if !(defined(VISP_HAVE_REALSENSE2) && (RS2_API_VERSION > ((2 * 10000) + (31 * 100) + 0)))
174 std::cout << "Install librealsense version > 2.31.0, configure and build ViSP again to use this example" << std::endl;
175#endif
176#if (VISP_CXX_STANDARD < VISP_CXX_STANDARD_11)
177 std::cout << "This tutorial should be built with c++11 support" << std::endl;
178#endif
179#endif
180}
static const vpColor red
Definition vpColor.h:211
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...
Use the X11 console to display images on unix-like OS. Thus to enable this class X11 should be instal...
Definition vpDisplayX.h:132
Class that defines generic functionalities for display.
Definition vpDisplay.h:173
static void display(const vpImage< unsigned char > &I)
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:59
Definition of the vpImage class member functions.
Definition vpImage.h:135
unsigned int getWidth() const
Definition vpImage.h:242
unsigned int getHeight() const
Definition vpImage.h:184
void acquire(vpImage< unsigned char > &grey, double *ts=NULL)
bool open(const rs2::config &cfg=rs2::config())
VISP_EXPORT double measureTimeMs()