52#include <visp3/core/vpConfig.h>
53#include <visp3/core/vpDebug.h>
54#if defined(VISP_HAVE_DC1394)
56#include <visp3/core/vpDisplay.h>
57#include <visp3/core/vpImage.h>
58#include <visp3/core/vpIoTools.h>
59#include <visp3/core/vpRGBa.h>
60#include <visp3/core/vpTime.h>
61#include <visp3/gui/vpDisplayX.h>
62#include <visp3/io/vpImageIo.h>
63#include <visp3/io/vpParseArgv.h>
64#include <visp3/sensor/vp1394TwoGrabber.h>
69#define GETOPTARGS "b:c:df:g:hH:L:mn:io:p:rsT:v:W:"
72#ifdef ENABLE_VISP_NAMESPACE
91void usage(
const char *name,
const char *badparam,
unsigned int camera,
const unsigned int &nframes,
92 const std::string &opath,
const unsigned int &roi_left,
const unsigned int &roi_top,
93 const unsigned int &roi_width,
const unsigned int &roi_height,
const unsigned int &ringbuffersize,
94 const unsigned int &panControl)
97 fprintf(stderr,
"\nERROR: Bad parameter [%s]\n", badparam);
101 %s [-v <video mode>] [-f <framerate>] \n\
102 [-g <color coding>] [-c <camera id>] [-m] [-n <frames>] \n\
103 [-i] [-s] [-d] [-o <filename>] [-L <format 7 roi left position>] \n\
104 [-T <format 7 roi top position>] [-W <format 7 roi width>] \n\
105 [-H <format 7 roi height>] [-b <ring buffer size>] \n\
106 [-p <pan control value>] [-R] [-h]\n\
109 Test for firewire camera image acquisition.\n\
114 Indicates the current settings for the first camera found on the bus.\n\n\
116 Gives information on the first camera found on the bus.\n\n\
118 Indicates the current settings for all the cameras found on the bus.\n\n\
120 Gives information on all the cameras found on the bus.\n\
122 Grab images from camera 1.\n\n\
124 Grab images from all the cameras.\n\n\
126 If a stereo camera is connected to the bus like the PointGrey Bumblebee,\n\
127 you may set the pan control to select the camera view:\n\
129 Transmit right imge.\n\
131 Transmit left imge.\n\
134 -v [%%u] : Video mode to set for the active camera.\n\
135 Use -s option so see which are the supported \n\
136 video modes. You can select the active \n\
137 camera using -c option.\n\
139 -f [%%u] : Framerate to set for the active camera.\n\
140 Use -s option so see which are the supported \n\
141 framerates. You can select the active \n\
142 camera using -c option.\n\
144 -g [%%u] : Color coding to set for the active camera\n\
145 in format 7 video mode. Use -s option so see if \n\
146 format 7 is supported by the camera and if so, \n\
147 which are the supported color codings. You can \n\
148 select the active camera using -c option.\n\
149 See -t <top>, -l <left>, -w <width>, \n\
150 -h <height> option to set format 7 roi.\n\
152 -L [%%u] : Format 7 region of interest (roi) left %u\n\
153 position. This option is only used if video\n\
156 -T [%%u] : Format 7 region of interest (roi) top %u\n\
157 position. This option is only used if video\n\
160 -W [%%u] : Format 7 region of interest (roi) width. %u\n\
161 Is set to zero, use the maximum width. This\n\
162 option is only used if video mode is format 7.\n\
164 -H [%%u] : Format 7 region of interest (roi) height. %u\n\
165 Is set to zero, use the maximum height. This\n\
166 option is only used if video mode is format 7.\n\
168 -c [%%u] : Active camera identifier. %u\n\
169 Zero is for the first camera found on the bus.\n\
171 -m : Flag to active multi camera acquisition. \n\
172 You need at least two cameras connected on \n\
175 -n [%%u] : Number of frames to acquire. %u\n\
177 -i : Flag to print camera information.\n\
179 -s : Print camera settings capabilities such as \n\
180 video mode and framerates available and exit.\n\
182 -d : Flag to turn off image display.\n\
184 -b [%%u] : Ring buffer size used during capture %u\n\
186 -p [%%u] : Pan control value used to control single or %u\n\
187 multiple image transmission from stereo vision \n\
188 cameras by setting the PAN register 0x884.\n\
190 -o [%%s] : Filename for image saving. \n\
192 The first %%d is for the camera id. The second\n\
193 %%04d is for the image numbering. The format is set \n\
194 by the extension of the file (ex .png, .pgm, ...) \n\
196 -r : Reset the bus attached to the first camera found.\n\
197 Bus reset may help to make firewire working if the\n\
198 program was not properly stopped by a CTRL-C.\n\
200 -h : Print this help.\n\
202 name, name, name, name, name, name, name, name, name, roi_left, roi_top, roi_width, roi_height, camera,
203 nframes, ringbuffersize, panControl, opath.c_str());
248bool read_options(
int argc,
const char **argv,
bool &multi,
unsigned int &camera,
unsigned int &nframes,
249 bool &verbose_info,
bool &verbose_settings,
bool &videomode_is_set,
253 unsigned int &ringbuffersize,
bool &display,
bool &save, std::string &opath,
unsigned int &roi_left,
254 unsigned int &roi_top,
unsigned int &roi_width,
unsigned int &roi_height,
bool &reset,
255 unsigned int &panControl,
bool &panControl_is_set)
266 camera =
static_cast<unsigned int>(atoi(optarg_));
272 framerate_is_set =
true;
276 colorcoding_is_set =
true;
280 roi_height =
static_cast<unsigned int>(atoi(optarg_));
286 roi_left =
static_cast<unsigned int>(atoi(optarg_));
292 nframes =
static_cast<unsigned int>(atoi(optarg_));
299 ringbuffersize_is_set =
true;
300 ringbuffersize =
static_cast<unsigned int>(atoi(optarg_));
303 panControl =
static_cast<unsigned int>(atoi(optarg_));
304 panControl_is_set =
true;
310 verbose_settings =
true;
313 roi_top =
static_cast<unsigned int>(atoi(optarg_));
316 videomode_is_set =
true;
320 roi_width =
static_cast<unsigned int>(atoi(optarg_));
324 usage(argv[0],
nullptr, camera, nframes, opath, roi_left, roi_top, roi_width, roi_height, ringbuffersize,
330 if ((c == 1) || (c == -1)) {
332 usage(argv[0],
nullptr, camera, nframes, opath, roi_left, roi_top, roi_width, roi_height, ringbuffersize, panControl);
333 std::cerr <<
"ERROR: " << std::endl;
334 std::cerr <<
" Bad argument " << optarg_ << std::endl << std::endl;
349int main(
int argc,
const char **argv)
352 unsigned int camera = 0;
354 bool verbose_info =
false;
355 bool verbose_settings =
false;
357 unsigned int nframes = 50;
359 bool videomode_is_set =
false;
361 bool framerate_is_set =
false;
363 bool colorcoding_is_set =
false;
365 bool ringbuffersize_is_set =
false;
366 unsigned int ringbuffersize = 4;
369 unsigned int panControl = 0;
370 bool panControl_is_set =
false;
373 unsigned int roi_left = 0, roi_top = 0, roi_width = 0, roi_height = 0;
376 std::string opath =
"/tmp/I%d-%04d.ppm";
378 if (read_options(argc, argv, multi, camera, nframes, verbose_info, verbose_settings, videomode_is_set, videomode,
379 framerate_is_set, framerate, colorcoding_is_set, colorcoding, ringbuffersize_is_set,
380 ringbuffersize, display, save, opath, roi_left, roi_top, roi_width, roi_height, reset, panControl,
381 panControl_is_set) ==
false) {
394 unsigned int ncameras = 0;
395 g.getNumCameras(ncameras);
397 std::cout <<
"Number of cameras on the bus: " << ncameras << std::endl;
403 std::cout <<
"You have only " << ncameras <<
" camera connected on the bus." << std::endl;
404 std::cout <<
"It is not possible to active multi-camera acquisition." << std::endl;
405 std::cout <<
"Disable -m command line option, or connect an other " << std::endl;
406 std::cout <<
"cameras on the bus." << std::endl;
411 if (camera >= ncameras) {
412 std::cout <<
"You have only " << ncameras;
413 std::cout <<
" camera connected on the bus." << std::endl;
414 std::cout <<
"It is not possible to select camera " << camera << std::endl;
415 std::cout <<
"Check your -c <camera> command line option." << std::endl;
432 if (verbose_info || verbose_settings) {
433 for (
unsigned int i = 0;
i < ncameras;
i++) {
435 g.setCamera(i + offset);
440 if (verbose_settings) {
444 std::list<vp1394TwoGrabber::vp1394TwoVideoModeType> lmode;
445 std::list<vp1394TwoGrabber::vp1394TwoFramerateType> lfps;
446 std::list<vp1394TwoGrabber::vp1394TwoColorCodingType> lcoding;
447 std::list<vp1394TwoGrabber::vp1394TwoVideoModeType>::const_iterator it_lmode;
448 std::list<vp1394TwoGrabber::vp1394TwoFramerateType>::const_iterator it_lfps;
449 std::list<vp1394TwoGrabber::vp1394TwoColorCodingType>::const_iterator it_lcoding;
452 g.getVideoMode(curmode);
453 g.getFramerate(curfps);
454 g.getColorCoding(curcoding);
455 g.getVideoModeSupported(lmode);
458 std::cout <<
"----------------------------------------------------------" << std::endl
459 <<
"---- Video modes and framerates supported by camera " <<
i + offset <<
" ----" << std::endl
460 <<
"---- with guid 0x" << std::hex << guid <<
" ----" << std::endl
461 <<
"---- * is for the current settings ----" << std::endl
462 <<
"---- between ( ) you have the corresponding option ----" << std::endl
463 <<
"---- to use. ----" << std::endl
464 <<
"----------------------------------------------------------" << std::endl;
466 for (it_lmode = lmode.begin(); it_lmode != lmode.end(); ++it_lmode) {
469 std::stringstream ss;
470 ss << static_cast<int>(supmode);
471 if (curmode == supmode)
478 if (g.isVideoModeFormat7(supmode)) {
481 g.getColorCodingSupported(supmode, lcoding);
482 for (it_lcoding = lcoding.begin(); it_lcoding != lcoding.end(); ++it_lcoding) {
484 supcoding = *it_lcoding;
485 std::stringstream ss;
486 ss << static_cast<int>(supcoding);
487 if ((curmode == supmode) && (supcoding == curcoding))
498 g.getFramerateSupported(supmode, lfps);
499 for (it_lfps = lfps.begin(); it_lfps != lfps.end(); ++it_lfps) {
501 std::stringstream ss;
502 ss << static_cast<int>(supfps);
503 if ((curmode == supmode) && (supfps == curfps))
512 std::cout <<
"----------------------------------------------------------" << std::endl;
520 if (panControl_is_set) {
521 g.setPanControl(panControl);
525 if (videomode_is_set) {
527 g.setVideoMode(videomode);
532 g.getVideoMode(videomode);
534 if (framerate_is_set) {
536 g.setFramerate(framerate);
538 if (colorcoding_is_set) {
540 g.setColorCoding(colorcoding);
542 if (ringbuffersize_is_set) {
543 g.setRingBufferSize(ringbuffersize);
547 if (g.isVideoModeFormat7(videomode))
548 g.setFormat7ROI(roi_left, roi_top, roi_width, roi_height);
551 bool *grab_color =
new bool[ncameras];
565 for (
unsigned int i = 0;
i < ncameras;
i++) {
567 g.setCamera(i + offset);
570 grab_color[
i] = g.isColor();
574 std::cout <<
"Image size for camera " <<
i + offset <<
" : width: " << Ic[
i].
getWidth()
575 <<
" height: " << Ic[
i].
getHeight() << std::endl;
580 std::stringstream title;
581 title <<
"Images captured by camera ";
583 d[
i].init(Ic[i],
static_cast<int>(100 + i * 50),
static_cast<int>(100 + i * 50), title.str());
591 std::cout <<
"Image size for camera " <<
i + offset <<
" : width: " << Ig[
i].
getWidth()
592 <<
" height: " << Ig[
i].
getHeight() << std::endl;
597 std::stringstream title;
598 title <<
"Images captured by camera ";
600 d[
i].init(Ig[i],
static_cast<int>(100 + i * 50),
static_cast<int>(100 + i * 50), title.str());
609 std::cout <<
"Capture in process..." << std::endl;
611 double tbegin = 0, ttotal = 0;
615 for (
unsigned int i = 0;
i < nframes;
i++) {
616 for (
unsigned int c = 0; c < ncameras; c++) {
618 g.setCamera(c + offset);
641 char buf[FILENAME_MAX];
642 snprintf(buf, FILENAME_MAX, opath.c_str(), c + offset, i);
644 std::cout <<
"Write: " <<
filename << std::endl;
654 double tloop = tend - tbegin;
656 std::cout <<
"loop time: " << tloop <<
" ms" << std::endl;
660 std::cout <<
"Mean loop time: " << ttotal / nframes <<
" ms" << std::endl;
661 std::cout <<
"Mean frequency: " << 1000. / (ttotal / nframes) <<
" fps" << std::endl;
679 std::cout <<
"Catch an exception: " <<
e << std::endl;
686 std::cout <<
"This example requires dc1394 SDK. " << std::endl;
687 std::cout <<
"Tip if you are on a unix-like system:" << std::endl;
688 std::cout <<
"- Install libdc1394-2, configure again ViSP using cmake and build again this example" << std::endl;
Class for firewire ieee1394 video devices using libdc1394-2.x api.
static std::string colorCoding2string(vp1394TwoColorCodingType colorcoding)
static std::string framerate2string(vp1394TwoFramerateType fps)
static std::string videoMode2string(vp1394TwoVideoModeType videomode)
Use the X11 console to display images on unix-like OS. Thus to enable this class X11 should be instal...
static void display(const vpImage< unsigned char > &I)
static void flush(const vpImage< unsigned char > &I)
error that can be emitted by ViSP classes.
static void write(const vpImage< unsigned char > &I, const std::string &filename, int backend=IO_DEFAULT_BACKEND)
Definition of the vpImage class member functions.
unsigned int getWidth() const
unsigned int getHeight() const
static bool parse(int *argcPtr, const char **argv, vpArgvInfo *argTable, int flags)
VISP_EXPORT double measureTimeMs()
VISP_EXPORT int wait(double t0, double t)