54 #include <visp3/core/vpConfig.h>
55 #include <visp3/core/vpDebug.h>
56 #if defined(VISP_HAVE_DC1394)
58 #include <visp3/core/vpDisplay.h>
59 #include <visp3/core/vpImage.h>
60 #include <visp3/core/vpRGBa.h>
61 #include <visp3/core/vpTime.h>
62 #include <visp3/gui/vpDisplayX.h>
63 #include <visp3/io/vpImageIo.h>
64 #include <visp3/io/vpParseArgv.h>
65 #include <visp3/sensor/vp1394TwoGrabber.h>
70 #define GETOPTARGS "b:c:df:g:hH:L:mn:io:p:rsT:v:W:"
73 #ifdef ENABLE_VISP_NAMESPACE
92 void usage(
const char *name,
const char *badparam,
unsigned int camera,
const unsigned int &nframes,
93 const std::string &opath,
const unsigned int &roi_left,
const unsigned int &roi_top,
94 const unsigned int &roi_width,
const unsigned int &roi_height,
const unsigned int &ringbuffersize,
95 const unsigned int &panControl)
98 fprintf(stderr,
"\nERROR: Bad parameter [%s]\n", badparam);
102 %s [-v <video mode>] [-f <framerate>] \n\
103 [-g <color coding>] [-c <camera id>] [-m] [-n <frames>] \n\
104 [-i] [-s] [-d] [-o <filename>] [-L <format 7 roi left position>] \n\
105 [-T <format 7 roi top position>] [-W <format 7 roi width>] \n\
106 [-H <format 7 roi height>] [-b <ring buffer size>] \n\
107 [-p <pan control value>] [-R] [-h]\n\
110 Test for firewire camera image acquisition.\n\
115 Indicates the current settings for the first camera found on the bus.\n\n\
117 Gives information on the first camera found on the bus.\n\n\
119 Indicates the current settings for all the cameras found on the bus.\n\n\
121 Gives information on all the cameras found on the bus.\n\
123 Grab images from camera 1.\n\n\
125 Grab images from all the cameras.\n\n\
127 If a stereo camera is connected to the bus like the PointGrey Bumblebee,\n\
128 you may set the pan control to select the camera view:\n\
130 Transmit right imge.\n\
132 Transmit left imge.\n\
135 -v [%%u] : Video mode to set for the active camera.\n\
136 Use -s option so see which are the supported \n\
137 video modes. You can select the active \n\
138 camera using -c option.\n\
140 -f [%%u] : Framerate to set for the active camera.\n\
141 Use -s option so see which are the supported \n\
142 framerates. You can select the active \n\
143 camera using -c option.\n\
145 -g [%%u] : Color coding to set for the active camera\n\
146 in format 7 video mode. Use -s option so see if \n\
147 format 7 is supported by the camera and if so, \n\
148 which are the supported color codings. You can \n\
149 select the active camera using -c option.\n\
150 See -t <top>, -l <left>, -w <width>, \n\
151 -h <height> option to set format 7 roi.\n\
153 -L [%%u] : Format 7 region of interest (roi) left %u\n\
154 position. This option is only used if video\n\
157 -T [%%u] : Format 7 region of interest (roi) top %u\n\
158 position. This option is only used if video\n\
161 -W [%%u] : Format 7 region of interest (roi) width. %u\n\
162 Is set to zero, use the maximum width. This\n\
163 option is only used if video mode is format 7.\n\
165 -H [%%u] : Format 7 region of interest (roi) height. %u\n\
166 Is set to zero, use the maximum height. This\n\
167 option is only used if video mode is format 7.\n\
169 -c [%%u] : Active camera identifier. %u\n\
170 Zero is for the first camera found on the bus.\n\
172 -m : Flag to active multi camera acquisition. \n\
173 You need at least two cameras connected on \n\
176 -n [%%u] : Number of frames to acquire. %u\n\
178 -i : Flag to print camera information.\n\
180 -s : Print camera settings capabilities such as \n\
181 video mode and framerates available and exit.\n\
183 -d : Flag to turn off image display.\n\
185 -b [%%u] : Ring buffer size used during capture %u\n\
187 -p [%%u] : Pan control value used to control single or %u\n\
188 multiple image transmission from stereo vision \n\
189 cameras by setting the PAN register 0x884.\n\
191 -o [%%s] : Filename for image saving. \n\
193 The first %%d is for the camera id. The second\n\
194 %%04d is for the image numbering. The format is set \n\
195 by the extension of the file (ex .png, .pgm, ...) \n\
197 -r : Reset the bus attached to the first camera found.\n\
198 Bus reset may help to make firewire working if the\n\
199 program was not properly stopped by a CTRL-C.\n\
201 -h : Print this help.\n\
203 name, name, name, name, name, name, name, name, name, roi_left, roi_top, roi_width, roi_height, camera,
204 nframes, ringbuffersize, panControl, opath.c_str());
249 bool read_options(
int argc,
const char **argv,
bool &multi,
unsigned int &camera,
unsigned int &nframes,
250 bool &verbose_info,
bool &verbose_settings,
bool &videomode_is_set,
254 unsigned int &ringbuffersize,
bool &display,
bool &save, std::string &opath,
unsigned int &roi_left,
255 unsigned int &roi_top,
unsigned int &roi_width,
unsigned int &roi_height,
bool &reset,
256 unsigned int &panControl,
bool &panControl_is_set)
267 camera = (
unsigned int)atoi(optarg_);
273 framerate_is_set =
true;
277 colorcoding_is_set =
true;
281 roi_height = (
unsigned int)atoi(optarg_);
287 roi_left = (
unsigned int)atoi(optarg_);
293 nframes = (
unsigned int)atoi(optarg_);
300 ringbuffersize_is_set =
true;
301 ringbuffersize = (
unsigned int)atoi(optarg_);
304 panControl = (
unsigned int)atoi(optarg_);
305 panControl_is_set =
true;
311 verbose_settings =
true;
314 roi_top = (
unsigned int)atoi(optarg_);
317 videomode_is_set =
true;
321 roi_width = (
unsigned int)atoi(optarg_);
325 usage(argv[0],
nullptr, camera, nframes, opath, roi_left, roi_top, roi_width, roi_height, ringbuffersize,
332 if ((c == 1) || (c == -1)) {
334 usage(argv[0],
nullptr, camera, nframes, opath, roi_left, roi_top, roi_width, roi_height, ringbuffersize, panControl);
335 std::cerr <<
"ERROR: " << std::endl;
336 std::cerr <<
" Bad argument " << optarg_ << std::endl << std::endl;
351 int main(
int argc,
const char **argv)
354 unsigned int camera = 0;
356 bool verbose_info =
false;
357 bool verbose_settings =
false;
359 unsigned int nframes = 50;
361 bool videomode_is_set =
false;
363 bool framerate_is_set =
false;
365 bool colorcoding_is_set =
false;
367 bool ringbuffersize_is_set =
false;
368 unsigned int ringbuffersize = 4;
371 unsigned int panControl = 0;
372 bool panControl_is_set =
false;
375 unsigned int roi_left = 0, roi_top = 0, roi_width = 0, roi_height = 0;
378 std::string opath =
"/tmp/I%d-%04d.ppm";
380 if (read_options(argc, argv, multi, camera, nframes, verbose_info, verbose_settings, videomode_is_set, videomode,
381 framerate_is_set, framerate, colorcoding_is_set, colorcoding, ringbuffersize_is_set,
382 ringbuffersize, display, save, opath, roi_left, roi_top, roi_width, roi_height, reset, panControl,
383 panControl_is_set) ==
false) {
396 unsigned int ncameras = 0;
397 g.getNumCameras(ncameras);
399 std::cout <<
"Number of cameras on the bus: " << ncameras << std::endl;
405 std::cout <<
"You have only " << ncameras <<
" camera connected on the bus." << std::endl;
406 std::cout <<
"It is not possible to active multi-camera acquisition." << std::endl;
407 std::cout <<
"Disable -m command line option, or connect an other " << std::endl;
408 std::cout <<
"cameras on the bus." << std::endl;
413 if (camera >= ncameras) {
414 std::cout <<
"You have only " << ncameras;
415 std::cout <<
" camera connected on the bus." << std::endl;
416 std::cout <<
"It is not possible to select camera " << camera << std::endl;
417 std::cout <<
"Check your -c <camera> command line option." << std::endl;
434 if (verbose_info || verbose_settings) {
435 for (
unsigned int i = 0; i < ncameras; i++) {
437 g.setCamera(i + offset);
442 if (verbose_settings) {
446 std::list<vp1394TwoGrabber::vp1394TwoVideoModeType> lmode;
447 std::list<vp1394TwoGrabber::vp1394TwoFramerateType> lfps;
448 std::list<vp1394TwoGrabber::vp1394TwoColorCodingType> lcoding;
449 std::list<vp1394TwoGrabber::vp1394TwoVideoModeType>::const_iterator it_lmode;
450 std::list<vp1394TwoGrabber::vp1394TwoFramerateType>::const_iterator it_lfps;
451 std::list<vp1394TwoGrabber::vp1394TwoColorCodingType>::const_iterator it_lcoding;
454 g.getVideoMode(curmode);
455 g.getFramerate(curfps);
456 g.getColorCoding(curcoding);
457 g.getVideoModeSupported(lmode);
460 std::cout <<
"----------------------------------------------------------" << std::endl
461 <<
"---- Video modes and framerates supported by camera " << i + offset <<
" ----" << std::endl
462 <<
"---- with guid 0x" << std::hex << guid <<
" ----" << std::endl
463 <<
"---- * is for the current settings ----" << std::endl
464 <<
"---- between ( ) you have the corresponding option ----" << std::endl
465 <<
"---- to use. ----" << std::endl
466 <<
"----------------------------------------------------------" << std::endl;
468 for (it_lmode = lmode.begin(); it_lmode != lmode.end(); ++it_lmode) {
471 std::stringstream ss;
473 if (curmode == supmode)
480 if (g.isVideoModeFormat7(supmode)) {
483 g.getColorCodingSupported(supmode, lcoding);
484 for (it_lcoding = lcoding.begin(); it_lcoding != lcoding.end(); ++it_lcoding) {
486 supcoding = *it_lcoding;
487 std::stringstream ss;
488 ss << (int)supcoding;
489 if ((curmode == supmode) && (supcoding == curcoding))
500 g.getFramerateSupported(supmode, lfps);
501 for (it_lfps = lfps.begin(); it_lfps != lfps.end(); ++it_lfps) {
503 std::stringstream ss;
505 if ((curmode == supmode) && (supfps == curfps))
514 std::cout <<
"----------------------------------------------------------" << std::endl;
522 if (panControl_is_set) {
523 g.setPanControl(panControl);
527 if (videomode_is_set) {
529 g.setVideoMode(videomode);
534 g.getVideoMode(videomode);
536 if (framerate_is_set) {
538 g.setFramerate(framerate);
540 if (colorcoding_is_set) {
542 g.setColorCoding(colorcoding);
544 if (ringbuffersize_is_set) {
545 g.setRingBufferSize(ringbuffersize);
549 if (g.isVideoModeFormat7(videomode))
550 g.setFormat7ROI(roi_left, roi_top, roi_width, roi_height);
553 bool *grab_color =
new bool[ncameras];
557 vpDisplayX *d =
nullptr;
559 d =
new vpDisplayX[ncameras];
567 for (
unsigned int i = 0; i < ncameras; i++) {
569 g.setCamera(i + offset);
572 grab_color[i] = g.isColor();
576 std::cout <<
"Image size for camera " << i + offset <<
" : width: " << Ic[i].
getWidth()
577 <<
" height: " << Ic[i].
getHeight() << std::endl;
582 std::stringstream title;
583 title <<
"Images captured by camera ";
585 d[i].
init(Ic[i], (
int)(100 + i * 50), (
int)(100 + i * 50), title.str());
593 std::cout <<
"Image size for camera " << i + offset <<
" : width: " << Ig[i].
getWidth()
594 <<
" height: " << Ig[i].
getHeight() << std::endl;
599 std::stringstream title;
600 title <<
"Images captured by camera ";
602 d[i].
init(Ig[i], (
int)(100 + i * 50), (
int)(100 + i * 50), title.str());
611 std::cout <<
"Capture in process..." << std::endl;
613 double tbegin = 0, ttotal = 0;
617 for (
unsigned int i = 0; i < nframes; i++) {
618 for (
unsigned int c = 0; c < ncameras; c++) {
620 g.setCamera(c + offset);
643 char buf[FILENAME_MAX];
644 snprintf(buf, FILENAME_MAX, opath.c_str(), c + offset, i);
645 std::string filename(buf);
646 std::cout <<
"Write: " << filename << std::endl;
656 double tloop = tend - tbegin;
658 std::cout <<
"loop time: " << tloop <<
" ms" << std::endl;
662 std::cout <<
"Mean loop time: " << ttotal / nframes <<
" ms" << std::endl;
663 std::cout <<
"Mean frequency: " << 1000. / (ttotal / nframes) <<
" fps" << std::endl;
681 std::cout <<
"Catch an exception: " << e << std::endl;
688 std::cout <<
"This example requires dc1394 SDK. " << std::endl;
689 std::cout <<
"Tip if you are on a unix-like system:" << std::endl;
690 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)
void init(vpImage< unsigned char > &I, int winx=-1, int winy=-1, const std::string &title="") VP_OVERRIDE
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)
unsigned int getWidth() const
unsigned int getHeight() const
static bool parse(int *argcPtr, const char **argv, vpArgvInfo *argTable, int flags)
VISP_EXPORT int wait(double t0, double t)
VISP_EXPORT double measureTimeMs()