Visual Servoing Platform version 3.6.0
Loading...
Searching...
No Matches
tutorial-grabber-bebop2.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
8#ifdef VISP_HAVE_MODULE_ROBOT
9#include <visp3/robot/vpRobotBebop2.h>
10
11void usage(const char *argv[], int error)
12{
13 std::cout << "SYNOPSIS" << std::endl
14 << " " << argv[0] << " [--ip <address>]"
15 << " [--hd-resolution]"
16 << " [--seqname <sequence name>]"
17 << " [--record <mode>]"
18 << " [--no-display]"
19 << " [--help] [-h]" << std::endl
20 << std::endl;
21 std::cout << "DESCRIPTION" << std::endl
22 << " --ip <address>" << std::endl
23 << " IP address of the drone to which you want to connect." << std::endl
24 << " Default: 192.168.42.1" << std::endl
25 << std::endl
26 << " --hd-resolution" << std::endl
27 << " Enables HD 720p images instead of default 480p." << std::endl
28 << " Caution : The camera settings are different depending on whether the resolution is 720p or 480p."
29 << std::endl
30 << std::endl
31 << " --seqname <sequence name>" << std::endl
32 << " Name of the sequence of image to create (ie: /tmp/image%04d.jpg)." << std::endl
33 << " Default: empty." << std::endl
34 << std::endl
35 << " --record <mode>" << std::endl
36 << " Allowed values for mode are:" << std::endl
37 << " 0: record all the captures images (continuous mode)," << std::endl
38 << " 1: record only images selected by a user click (single shot mode)." << std::endl
39 << " Default mode: 0" << std::endl
40 << std::endl
41 << " --no-display" << std::endl
42 << " Disable displaying captured images." << std::endl
43 << " When used and sequence name specified, record mode is internally set to 1 (continuous mode)."
44 << std::endl
45 << std::endl
46 << " --help, -h" << std::endl
47 << " Print this helper message." << std::endl
48 << std::endl;
49 std::cout << "USAGE" << std::endl
50 << " Example to visualize images:" << std::endl
51 << " " << argv[0] << std::endl
52 << std::endl
53 << " Examples to record a sequence of 720p images from drone with ip different from default:" << std::endl
54 << " " << argv[0] << " --seqname I%04d.png --ip 192.168.42.3 --hd_resolution" << std::endl
55 << " " << argv[0] << " --seqname folder/I%04d.png --record 0 --ip 192.168.42.3 --hd-resolution"
56 << std::endl
57 << std::endl
58 << " Examples to record single shot images:" << std::endl
59 << " " << argv[0] << " --seqname I%04d.png --record 1" << std::endl
60 << " " << argv[0] << " --seqname folder/I%04d.png --record 1" << std::endl
61 << std::endl;
62
63 if (error) {
64 std::cout << "Error" << std::endl
65 << " "
66 << "Unsupported parameter " << argv[error] << std::endl;
67 }
68}
69
73int main(int argc, const char **argv)
74{
75#if defined(VISP_HAVE_ARSDK) && defined(VISP_HAVE_FFMPEG) && (VISP_CXX_STANDARD >= VISP_CXX_STANDARD_11)
76 try {
77 std::string opt_seqname;
78 int opt_record_mode = 0;
79 int image_res = 0;
80 std::string ip_address = "192.168.42.1";
81 bool opt_display = true;
82
83 for (int i = 1; i < argc; i++) {
84 if (std::string(argv[i]) == "--seqname") {
85 opt_seqname = std::string(argv[i + 1]);
86 i++;
87 } else if (std::string(argv[i]) == "--record") {
88 opt_record_mode = std::atoi(argv[i + 1]);
89 i++;
90 } else if (std::string(argv[i]) == "--ip" && i + 1 < argc) {
91 ip_address = std::string(argv[i + 1]);
92 i++;
93 } else if (std::string(argv[i]) == "--hd-resolution") {
94 image_res = 1;
95 } else if (std::string(argv[i]) == "--no-display") {
96 opt_display = false;
97 } else if (std::string(argv[i]) == "--help" || std::string(argv[i]) == "-h") {
98 usage(argv, 0);
99 return EXIT_SUCCESS;
100 } else {
101 usage(argv, i);
102 return EXIT_FAILURE;
103 }
104 }
105
106 if ((!opt_display) && (!opt_seqname.empty())) {
107 opt_record_mode = 0;
108 }
109
110 std::cout << "Recording : " << (opt_seqname.empty() ? "disabled" : "enabled") << std::endl;
111 std::cout << "Display : " << (opt_display ? "enabled" : "disabled") << std::endl;
112
113 std::string text_record_mode =
114 std::string("Record mode: ") + (opt_record_mode ? std::string("single") : std::string("continuous"));
115
116 if (!opt_seqname.empty()) {
117 std::cout << text_record_mode << std::endl;
118 std::cout << "Record name: " << opt_seqname << std::endl;
119 }
120 std::cout << "Image resolution : " << (image_res == 0 ? "480p." : "720p.") << std::endl << std::endl;
121
122 vpImage<vpRGBa> I(1, 1, 0);
123
124 vpRobotBebop2 drone(false, true, ip_address);
125
126 if (drone.isRunning()) {
127
128 drone.setVideoResolution(image_res);
129
130 drone.startStreaming();
131 drone.setExposure(1.5f);
132 drone.getRGBaImage(I);
133 } else {
134 std::cout << "Error : failed to setup drone control" << std::endl;
135 return EXIT_FAILURE;
136 }
137
138 std::cout << "Image size : " << I.getWidth() << " " << I.getHeight() << std::endl;
139
140 vpDisplay *d = NULL;
141 if (opt_display) {
142#if !(defined(VISP_HAVE_X11) || defined(VISP_HAVE_GDI) || defined(VISP_HAVE_OPENCV))
143 std::cout << "No image viewer is available..." << std::endl;
144 opt_display = false;
145#endif
146 }
147 if (opt_display) {
148#ifdef VISP_HAVE_X11
149 d = new vpDisplayX(I);
150#elif defined(VISP_HAVE_GDI)
151 d = new vpDisplayGDI(I);
152#elif defined(HAVE_OPENCV_HIGHGUI)
153 d = new vpDisplayOpenCV(I);
154#endif
155 }
156
157 vpImageQueue<vpRGBa> image_queue(opt_seqname, opt_record_mode);
158 vpImageStorageWorker<vpRGBa> image_storage_worker(std::ref(image_queue));
159 std::thread image_storage_thread(&vpImageStorageWorker<vpRGBa>::run, &image_storage_worker);
160
161 bool quit = false;
162 while (!quit) {
163 double t = vpTime::measureTimeMs();
164 drone.getRGBaImage(I);
165
167
168 quit = image_queue.record(I);
169
170 std::stringstream ss;
171 ss << "Acquisition time: " << std::setprecision(3) << vpTime::measureTimeMs() - t << " ms";
172 vpDisplay::displayText(I, static_cast<int>(I.getHeight()) - 20, 10, ss.str(), vpColor::red);
174 }
175 image_queue.cancel();
176 image_storage_thread.join();
177
178 if (d) {
179 delete d;
180 }
181 } catch (const vpException &e) {
182 std::cout << "Caught an exception: " << e << std::endl;
183 }
184#else
185 (void)argc;
186 (void)argv;
187#ifndef VISP_HAVE_ARSDK
188 std::cout << "Install Parrot ARSDK3, configure and build ViSP again to use this example" << std::endl;
189#endif
190#ifndef VISP_HAVE_FFMPEG
191 std::cout << "Install ffmpeg, configure and build ViSP again to use this example" << std::endl;
192#endif
193#if (VISP_CXX_STANDARD < VISP_CXX_STANDARD_11)
194 std::cout << "This tutorial should be built with c++11 support" << std::endl;
195#endif
196#endif // #if defined(VISP_HAVE_ARSDK) && defined(VISP_HAVE_FFMPEG)
197}
198#else
199int main() { std::cout << "This tutorial needs visp_robot module that is not built." << std::endl; }
200#endif
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
VISP_EXPORT double measureTimeMs()