Visual Servoing Platform version 3.6.0
Loading...
Searching...
No Matches
tutorial-grabber-ids-ueye.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/vpUeyeGrabber.h>
8
9#define USE_COLOR // Comment to acquire gray level images
10
11void usage(const char *argv[], int error)
12{
13 std::cout << "SYNOPSIS" << std::endl
14 << " " << argv[0] << " [--device <index>]"
15 << " [--config-file <filename.ini>]"
16 << " [--fps <auto|fps value like 6|15|30|60>]"
17 << " [--gain <auto|value in 0 - 100>]"
18 << " [--shutter <auto|exposure value in ms>]"
19 << " [--subsample <factor>]"
20 << " [--white-balance <value>]"
21 << " [--color-mode <mode>]"
22 << " [--seqname <sequence name>]"
23 << " [--record <mode>]"
24 << " [--no-display]"
25 << " [--verbose] [-v]"
26 << " [--help] [-h]" << std::endl
27 << std::endl;
28 std::cout << "DESCRIPTION" << std::endl
29 << " --device <index>" << std::endl
30 << " Camera device index. Set 0 to dial with the first camera," << std::endl
31 << " and 1 to dial with the second camera attached to the computer." << std::endl
32 << " Default: 0" << std::endl
33 << std::endl
34 << " --config-file <filename.ini>" << std::endl
35 << " Camera config file." << std::endl
36 << " Default: empty." << std::endl
37 << std::endl
38 << " --fps <auto|fps value like 6|15|30|60>" << std::endl
39 << " \"Auto\" or a frames per second value." << std::endl
40 << " Default: current setting." << std::endl
41 << std::endl
42 << " --gain <auto|value in 0 - 100>" << std::endl
43 << " \"Auto\" or manual gain with a value in 0 - 100." << std::endl
44 << " Default: current setting." << std::endl
45 << std::endl
46 << " --shutter <auto|manu>" << std::endl
47 << " \"Auto\" or manual shutter." << std::endl
48 << " Default: current setting." << std::endl
49 << std::endl
50 << " --subsample <factor>" << std::endl
51 << " Subsample factor to reduce image size alog rows and columns." << std::endl
52 << " Default: 1." << std::endl
53 << std::endl
54 << " --white-balance <value>" << std::endl
55 << " Possible values are 0 (disabled) or 1 (enabled)." << std::endl
56 << " Default: current setting." << std::endl
57 << std::endl
58 << " --color-mode <mode>" << std::endl
59 << " Possible modes are: mono8, rgb24, rgb32, bayer8." << std::endl
60 << " Default: current setting." << std::endl
61 << std::endl
62 << " --seqname <sequence name>" << std::endl
63 << " Name of the sequence of image to create (ie: /tmp/image%04d.jpg)." << std::endl
64 << " Default: empty." << std::endl
65 << std::endl
66 << " --record <mode>" << std::endl
67 << " Allowed values for mode are:" << std::endl
68 << " 0: record all the captures images (continuous mode)," << std::endl
69 << " 1: record only images selected by a user click (single shot mode)." << std::endl
70 << " Default mode: 0" << std::endl
71 << std::endl
72 << " --no-display" << std::endl
73 << " Disable displaying captured images." << std::endl
74 << " When used and sequence name specified, record mode is internally set to 1 (continuous mode)."
75 << std::endl
76 << std::endl
77 << " --verbose, -v" << std::endl
78 << " Enable extra printings." << std::endl
79 << std::endl
80 << " --help, -h" << std::endl
81 << " Print this helper message." << std::endl
82 << std::endl;
83 std::cout << "USAGE" << std::endl
84 << " Example to visualize images:" << std::endl
85 << " " << argv[0] << std::endl
86 << std::endl
87 << " Examples to record a sequence of images:" << std::endl
88 << " " << argv[0] << " --seqname I%04d.png" << std::endl
89 << " " << argv[0] << " --seqname folder/I%04d.png --record 0" << std::endl
90 << std::endl
91 << " Examples to record single shot images:\n"
92 << " " << argv[0] << " --seqname I%04d.png --record 1\n"
93 << " " << argv[0] << " --seqname folder/I%04d.png --record 1" << std::endl
94 << std::endl;
95
96 if (error) {
97 std::cout << "Error" << std::endl
98 << " "
99 << "Unsupported parameter " << argv[error] << std::endl;
100 }
101}
102
108int main(int argc, const char *argv[])
109{
110#if defined(VISP_HAVE_UEYE) && (VISP_CXX_STANDARD >= VISP_CXX_STANDARD_11)
111 try {
112 unsigned int opt_device = 0;
113 std::string opt_seqname;
114 int opt_record_mode = 0;
115 std::string opt_config_file = "";
116 std::string opt_fps = "";
117 std::string opt_gain = "";
118 std::string opt_shutter = "";
119 std::string opt_color_mode = "";
120 int opt_white_balance = -1;
121 int opt_subsample = 1;
122 bool opt_verbose = false;
123 bool opt_display = true;
124
125 for (int i = 1; i < argc; i++) {
126 if (std::string(argv[i]) == "--device") {
127 opt_device = static_cast<unsigned int>(std::atoi(argv[i + 1]));
128 i++;
129 } else if (std::string(argv[i]) == "--config-file") {
130 opt_config_file = std::string(argv[i + 1]);
131 i++;
132 } else if (std::string(argv[i]) == "--fps") {
133 opt_fps = std::string(argv[i + 1]);
134 i++;
135 } else if (std::string(argv[i]) == "--gain") {
136 opt_gain = std::string(argv[i + 1]);
137 i++;
138 } else if (std::string(argv[i]) == "--shutter") {
139 opt_shutter = std::string(argv[i + 1]);
140 i++;
141 } else if (std::string(argv[i]) == "--subsample") {
142 opt_subsample = std::atoi(argv[i + 1]);
143 i++;
144 } else if (std::string(argv[i]) == "--white-balance") {
145 opt_white_balance = std::atoi(argv[i + 1]);
146 i++;
147 } else if (std::string(argv[i]) == "--color-mode") {
148 opt_color_mode = std::string(argv[i + 1]);
149 i++;
150 } else if (std::string(argv[i]) == "--seqname") {
151 opt_seqname = std::string(argv[i + 1]);
152 i++;
153 } else if (std::string(argv[i]) == "--record") {
154 opt_record_mode = std::atoi(argv[i + 1]);
155 i++;
156 } else if (std::string(argv[i]) == "--verbose" || std::string(argv[i]) == "-v") {
157 opt_verbose = true;
158 } else if (std::string(argv[i]) == "--help" || std::string(argv[i]) == "-h") {
159 usage(argv, 0);
160 return EXIT_SUCCESS;
161 } else {
162 usage(argv, i);
163 return EXIT_FAILURE;
164 }
165 }
166
167 if ((!opt_display) && (!opt_seqname.empty())) {
168 opt_record_mode = 0;
169 }
170
172#ifdef USE_COLOR
173 vpImage<vpRGBa> I; // To acquire color images
174#else
175 vpImage<unsigned char> I; // To acquire gray images
176#endif
178
181
182 // Get info on connected cameras
183 std::vector<unsigned int> cam_ids = g.getCameraIDList();
184 std::vector<std::string> cam_models = g.getCameraModelList();
185 std::vector<std::string> cam_serials = g.getCameraSerialNumberList();
186
187 if (!cam_ids.size()) {
188 std::cout << "No camera detected. Plug a camera and try again..." << std::endl;
189 return EXIT_FAILURE;
190 }
191 std::cout << "Found " << cam_ids.size() << " cameras :" << std::endl;
192 for (unsigned int i = 0; i < cam_ids.size(); i++) {
193 std::cout << (opt_device == i ? " * Camera " : " Camera ") << i << " - ID: " << cam_ids[i]
194 << " Model: " << cam_models[i] << " S/N: " << cam_serials[i] << std::endl;
195 }
197
199 if (!g.setActiveCamera(opt_device)) {
200 std::cout << "Unable to select camera " << opt_device << std::endl;
201 return EXIT_FAILURE;
202 };
204
205 std::cout << "Active camera is Model " << g.getActiveCameraModel()
206 << " with S/N: " << g.getActiveCameraSerialNumber() << std::endl;
207
209 g.open(I);
211
212 if (!opt_config_file.empty()) {
214 g.loadParameters(opt_config_file);
216 // Since loaded parameters may affect image size, rescale image in case of
220 }
221
222 if (opt_subsample > 1) {
223 std::cout << "Subsampling factor: " << opt_subsample << std::endl;
224 g.setSubsampling(opt_subsample);
225 // Since subsampling may affect image size, rescale image in case of
227 }
228
229 if (!opt_gain.empty()) {
230 if (opt_gain == "auto") {
231 std::cout << "Auto gain : " << (g.setGain(true) ? "enabled" : "N/A") << std::endl;
232 } else {
233 std::cout << "Manual gain : "
234 << (g.setGain(false, std::atoi(opt_gain.c_str())) ? (std::string(opt_gain) + " %") : "N/A")
235 << std::endl;
236 }
237 }
238 if (!opt_shutter.empty()) {
239 if (opt_shutter == "auto") {
240 std::cout << "Auto shutter : " << (g.setExposure(true) ? "enabled" : "N/A") << std::endl;
241 } else {
242 std::cout << "Manual shutter : "
243 << (g.setExposure(false, std::atof(opt_shutter.c_str())) ? (std::string(opt_shutter) + " ms") : "N/A")
244 << std::endl;
245 }
246 }
247
248 if (opt_white_balance > 0) {
249 bool wb = (opt_white_balance ? true : false);
250 std::cout << "Subsampling factor: " << opt_subsample << std::endl;
251 std::cout << "White balance : " << (wb ? "auto" : "disabled") << std::endl;
252 g.setWhiteBalance(wb);
253 }
254
255 if (!opt_color_mode.empty()) {
256 if (g.setColorMode(opt_color_mode)) {
257 std::cout << "Color mode : " << opt_color_mode << std::endl;
258 }
259 }
260
261 if (!opt_fps.empty()) {
262 if (opt_fps == "auto") {
263 std::cout << "Auto framerate : " << (g.setFrameRate(true) ? "enabled" : "N/A") << std::endl;
264 } else {
265 std::cout << "Manual framerate : "
266 << (g.setFrameRate(false, std::atof(opt_fps.c_str())) ? (std::string(opt_fps) + " Hz") : "N/A")
267 << std::endl;
268 }
269 }
270
271 std::cout << "Recording : " << (opt_seqname.empty() ? "disabled" : "enabled") << std::endl;
272 std::cout << "Display : " << (opt_display ? "enabled" : "disabled") << std::endl;
273
274 std::string text_record_mode =
275 std::string("Record mode : ") + (opt_record_mode ? std::string("single") : std::string("continuous"));
276
277 if (!opt_seqname.empty()) {
278 std::cout << text_record_mode << std::endl;
279 std::cout << "Record name : " << opt_seqname << std::endl;
280 }
281
282 std::cout << "Config file : " << (opt_config_file.empty() ? "empty" : opt_config_file) << std::endl;
283 std::cout << "Image size : " << I.getWidth() << " " << I.getHeight() << std::endl;
284
285 vpDisplay *d = NULL;
286 if (opt_display) {
287#if !(defined(VISP_HAVE_X11) || defined(VISP_HAVE_GDI) || defined(VISP_HAVE_OPENCV))
288 std::cout << "No image viewer is available..." << std::endl;
289 opt_display = false;
290#endif
291 }
292 if (opt_display) {
293#ifdef VISP_HAVE_X11
294 d = new vpDisplayX;
295#elif defined(VISP_HAVE_GDI)
296 d = new vpDisplayGDI;
297#elif defined(HAVE_OPENCV_HIGHGUI)
298 d = new vpDisplayOpenCV;
299#endif
301 d->init(I);
302 }
303
304#ifdef USE_COLOR
305 vpImageQueue<vpRGBa> image_queue(opt_seqname, opt_record_mode);
306 vpImageStorageWorker<vpRGBa> image_storage_worker(std::ref(image_queue));
307 std::thread image_storage_thread(&vpImageStorageWorker<vpRGBa>::run, &image_storage_worker);
308#else
309 vpImageQueue<unsigned char> image_queue(opt_seqname, opt_record_mode);
310 vpImageStorageWorker<unsigned char> image_storage_worker(std::ref(image_queue));
311 std::thread image_storage_thread(&vpImageStorageWorker<unsigned char>::run, &image_storage_worker);
312#endif
313
314 bool quit = false;
315 double timestamp_camera = 0, timestamp_camera_prev = 0;
316 std::string timestamp_system;
317 while (!quit) {
318 g.acquire(I, &timestamp_camera, &timestamp_system);
319 double fps = g.getFramerate();
320
322
323 quit = image_queue.record(I, &timestamp_system);
324
325 if (opt_verbose) {
326 std::cout << "System timestamp: " << timestamp_system << std::endl;
327 std::cout << "Camera timestamp diff: " << timestamp_camera - timestamp_camera_prev << std::endl;
328 timestamp_camera_prev = timestamp_camera;
329 }
330 vpDisplay::displayText(I, static_cast<int>(I.getHeight() - 40 * vpDisplay::getDownScalingFactor(I)),
331 static_cast<int>(10 * vpDisplay::getDownScalingFactor(I)), timestamp_system, vpColor::red);
332 {
333 std::stringstream ss;
334 ss << "Camera framerate: " << fps;
335 vpDisplay::displayText(I, static_cast<int>(I.getHeight() - 60 * vpDisplay::getDownScalingFactor(I)),
336 static_cast<int>(10 * vpDisplay::getDownScalingFactor(I)), ss.str(), vpColor::red);
337 }
338
340 }
341 image_queue.cancel();
342 image_storage_thread.join();
343
344 if (d) {
345 delete d;
346 }
347 } catch (const vpException &e) {
348 std::cout << "Catch an exception: " << e << std::endl;
349 }
350#else
351 (void)argc;
352 (void)argv;
353#ifndef VISP_HAVE_UEYE
354 std::cout << "Install IDS uEye SDK, configure and build ViSP again to use this example" << std::endl;
355#endif
356#if (VISP_CXX_STANDARD < VISP_CXX_STANDARD_11)
357 std::cout << "This tutorial should be built with c++11 support" << std::endl;
358#endif
359#endif
360}
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
void init(vpImage< unsigned char > &I, int win_x=-1, int win_y=-1, const std::string &win_title="")
Class that defines generic functionalities for display.
Definition vpDisplay.h:173
virtual void setDownScalingFactor(unsigned int scale)
static void display(const vpImage< unsigned char > &I)
static void flush(const vpImage< unsigned char > &I)
unsigned int getDownScalingFactor()
Definition vpDisplay.h:231
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
void resize(unsigned int h, unsigned int w)
resize the image : Image initialization
Definition vpImage.h:795
unsigned int getHeight() const
Definition vpImage.h:184
void open(vpImage< unsigned char > &I)
std::vector< std::string > getCameraSerialNumberList() const
void acquire(vpImage< unsigned char > &I, double *timestamp_camera=NULL, std::string *timestamp_system=NULL)
bool setExposure(bool auto_exposure, double exposure_ms=-1)
bool setFrameRate(bool auto_frame_rate, double manual_frame_rate_hz=-1)
void setWhiteBalance(bool auto_wb)
bool setGain(bool auto_gain, int master_gain=-1, bool gain_boost=false)
double getFramerate() const
void loadParameters(const std::string &filename)
std::vector< std::string > getCameraModelList() const
std::vector< unsigned int > getCameraIDList() const
void setSubsampling(int factor)
unsigned int getFrameHeight() const
unsigned int getFrameWidth() const
bool setActiveCamera(unsigned int cam_index)
bool setColorMode(const std::string &color_mode)
std::string getActiveCameraModel() const
std::string getActiveCameraSerialNumber() const