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:"
88void usage(
const char *name,
const char *badparam,
unsigned int camera,
const unsigned int &nframes,
89 const std::string &opath,
const unsigned int &roi_left,
const unsigned int &roi_top,
90 const unsigned int &roi_width,
const unsigned int &roi_height,
const unsigned int &ringbuffersize,
91 const unsigned int &panControl)
94 fprintf(stderr,
"\nERROR: Bad parameter [%s]\n", badparam);
98 %s [-v <video mode>] [-f <framerate>] \n\
99 [-g <color coding>] [-c <camera id>] [-m] [-n <frames>] \n\
100 [-i] [-s] [-d] [-o <filename>] [-L <format 7 roi left position>] \n\
101 [-T <format 7 roi top position>] [-W <format 7 roi width>] \n\
102 [-H <format 7 roi height>] [-b <ring buffer size>] \n\
103 [-p <pan control value>] [-R] [-h]\n\
106 Test for firewire camera image acquisition.\n\
111 Indicates the current settings for the first camera found on the bus.\n\n\
113 Gives information on the first camera found on the bus.\n\n\
115 Indicates the current settings for all the cameras found on the bus.\n\n\
117 Gives information on all the cameras found on the bus.\n\
119 Grab images from camera 1.\n\n\
121 Grab images from all the cameras.\n\n\
123 If a stereo camera is connected to the bus like the PointGrey Bumblebee,\n\
124 you may set the pan control to select the camera view:\n\
126 Transmit right imge.\n\
128 Transmit left imge.\n\
131 -v [%%u] : Video mode to set for the active camera.\n\
132 Use -s option so see which are the supported \n\
133 video modes. You can select the active \n\
134 camera using -c option.\n\
136 -f [%%u] : Framerate to set for the active camera.\n\
137 Use -s option so see which are the supported \n\
138 framerates. You can select the active \n\
139 camera using -c option.\n\
141 -g [%%u] : Color coding to set for the active camera\n\
142 in format 7 video mode. Use -s option so see if \n\
143 format 7 is supported by the camera and if so, \n\
144 which are the supported color codings. You can \n\
145 select the active camera using -c option.\n\
146 See -t <top>, -l <left>, -w <width>, \n\
147 -h <height> option to set format 7 roi.\n\
149 -L [%%u] : Format 7 region of interest (roi) left %u\n\
150 position. This option is only used if video\n\
153 -T [%%u] : Format 7 region of interest (roi) top %u\n\
154 position. This option is only used if video\n\
157 -W [%%u] : Format 7 region of interest (roi) width. %u\n\
158 Is set to zero, use the maximum width. This\n\
159 option is only used if video mode is format 7.\n\
161 -H [%%u] : Format 7 region of interest (roi) height. %u\n\
162 Is set to zero, use the maximum height. This\n\
163 option is only used if video mode is format 7.\n\
165 -c [%%u] : Active camera identifier. %u\n\
166 Zero is for the first camera found on the bus.\n\
168 -m : Flag to active multi camera acquisition. \n\
169 You need at least two cameras connected on \n\
172 -n [%%u] : Number of frames to acquire. %u\n\
174 -i : Flag to print camera information.\n\
176 -s : Print camera settings capabilities such as \n\
177 video mode and framerates available and exit.\n\
179 -d : Flag to turn off image display.\n\
181 -b [%%u] : Ring buffer size used during capture %u\n\
183 -p [%%u] : Pan control value used to control single or %u\n\
184 multiple image transmission from stereo vision \n\
185 cameras by setting the PAN register 0x884.\n\
187 -o [%%s] : Filename for image saving. \n\
189 The first %%d is for the camera id. The second\n\
190 %%04d is for the image numbering. The format is set \n\
191 by the extension of the file (ex .png, .pgm, ...) \n\
193 -r : Reset the bus attached to the first camera found.\n\
194 Bus reset may help to make firewire working if the\n\
195 program was not properly stopped by a CTRL-C.\n\
197 -h : Print this help.\n\
199 name, name, name, name, name, name, name, name, name, roi_left, roi_top, roi_width, roi_height, camera,
200 nframes, ringbuffersize, panControl, opath.c_str());
245bool read_options(
int argc,
const char **argv,
bool &multi,
unsigned int &camera,
unsigned int &nframes,
246 bool &verbose_info,
bool &verbose_settings,
bool &videomode_is_set,
250 unsigned int &ringbuffersize,
bool &display,
bool &save, std::string &opath,
unsigned int &roi_left,
251 unsigned int &roi_top,
unsigned int &roi_width,
unsigned int &roi_height,
bool &reset,
252 unsigned int &panControl,
bool &panControl_is_set)
263 camera = (
unsigned int)atoi(optarg_);
269 framerate_is_set =
true;
273 colorcoding_is_set =
true;
277 roi_height = (
unsigned int)atoi(optarg_);
283 roi_left = (
unsigned int)atoi(optarg_);
289 nframes = (
unsigned int)atoi(optarg_);
296 ringbuffersize_is_set =
true;
297 ringbuffersize = (
unsigned int)atoi(optarg_);
300 panControl = (
unsigned int)atoi(optarg_);
301 panControl_is_set =
true;
307 verbose_settings =
true;
310 roi_top = (
unsigned int)atoi(optarg_);
313 videomode_is_set =
true;
317 roi_width = (
unsigned int)atoi(optarg_);
321 usage(argv[0], NULL, camera, nframes, opath, roi_left, roi_top, roi_width, roi_height, ringbuffersize,
328 if ((c == 1) || (c == -1)) {
330 usage(argv[0], NULL, camera, nframes, opath, roi_left, roi_top, roi_width, roi_height, ringbuffersize, panControl);
331 std::cerr <<
"ERROR: " << std::endl;
332 std::cerr <<
" Bad argument " << optarg_ << std::endl << std::endl;
347int main(
int argc,
const char **argv)
350 unsigned int camera = 0;
352 bool verbose_info =
false;
353 bool verbose_settings =
false;
355 unsigned int nframes = 50;
357 bool videomode_is_set =
false;
359 bool framerate_is_set =
false;
361 bool colorcoding_is_set =
false;
363 bool ringbuffersize_is_set =
false;
364 unsigned int ringbuffersize = 4;
367 unsigned int panControl = 0;
368 bool panControl_is_set =
false;
371 unsigned int roi_left = 0, roi_top = 0, roi_width = 0, roi_height = 0;
374 std::string opath =
"/tmp/I%d-%04d.ppm";
376 if (read_options(argc, argv, multi, camera, nframes, verbose_info, verbose_settings, videomode_is_set, videomode,
377 framerate_is_set, framerate, colorcoding_is_set, colorcoding, ringbuffersize_is_set,
378 ringbuffersize, display, save, opath, roi_left, roi_top, roi_width, roi_height, reset, panControl,
379 panControl_is_set)) {
393 unsigned int ncameras = 0;
394 g.getNumCameras(ncameras);
396 std::cout <<
"Number of cameras on the bus: " << ncameras << std::endl;
402 std::cout <<
"You have only " << ncameras <<
" camera connected on the bus." << std::endl;
403 std::cout <<
"It is not possible to active multi-camera acquisition." << std::endl;
404 std::cout <<
"Disable -m command line option, or connect an other " << std::endl;
405 std::cout <<
"cameras on the bus." << std::endl;
410 if (camera >= ncameras) {
411 std::cout <<
"You have only " << ncameras;
412 std::cout <<
" camera connected on the bus." << std::endl;
413 std::cout <<
"It is not possible to select camera " << camera << std::endl;
414 std::cout <<
"Check your -c <camera> command line option." << std::endl;
430 if (verbose_info || verbose_settings) {
431 for (
unsigned int i = 0; i < ncameras; i++) {
433 g.setCamera(i + offset);
438 if (verbose_settings) {
442 std::list<vp1394TwoGrabber::vp1394TwoVideoModeType> lmode;
443 std::list<vp1394TwoGrabber::vp1394TwoFramerateType> lfps;
444 std::list<vp1394TwoGrabber::vp1394TwoColorCodingType> lcoding;
445 std::list<vp1394TwoGrabber::vp1394TwoVideoModeType>::const_iterator it_lmode;
446 std::list<vp1394TwoGrabber::vp1394TwoFramerateType>::const_iterator it_lfps;
447 std::list<vp1394TwoGrabber::vp1394TwoColorCodingType>::const_iterator it_lcoding;
450 g.getVideoMode(curmode);
451 g.getFramerate(curfps);
452 g.getColorCoding(curcoding);
453 g.getVideoModeSupported(lmode);
456 std::cout <<
"----------------------------------------------------------" << std::endl
457 <<
"---- Video modes and framerates supported by camera " << i + offset <<
" ----" << std::endl
458 <<
"---- with guid 0x" << std::hex << guid <<
" ----" << std::endl
459 <<
"---- * is for the current settings ----" << std::endl
460 <<
"---- between ( ) you have the corresponding option ----" << std::endl
461 <<
"---- to use. ----" << std::endl
462 <<
"----------------------------------------------------------" << std::endl;
464 for (it_lmode = lmode.begin(); it_lmode != lmode.end(); ++it_lmode) {
467 if (curmode == supmode)
474 if (g.isVideoModeFormat7(supmode)) {
477 g.getColorCodingSupported(supmode, lcoding);
478 for (it_lcoding = lcoding.begin(); it_lcoding != lcoding.end(); ++it_lcoding) {
480 supcoding = *it_lcoding;
481 if ((curmode == supmode) && (supcoding == curcoding))
491 g.getFramerateSupported(supmode, lfps);
492 for (it_lfps = lfps.begin(); it_lfps != lfps.end(); ++it_lfps) {
494 if ((curmode == supmode) && (supfps == curfps))
503 std::cout <<
"----------------------------------------------------------" << std::endl;
511 if (panControl_is_set) {
512 g.setPanControl(panControl);
516 if (videomode_is_set) {
518 g.setVideoMode(videomode);
522 g.getVideoMode(videomode);
524 if (framerate_is_set) {
526 g.setFramerate(framerate);
528 if (colorcoding_is_set) {
530 g.setColorCoding(colorcoding);
532 if (ringbuffersize_is_set) {
533 g.setRingBufferSize(ringbuffersize);
537 if (g.isVideoModeFormat7(videomode))
538 g.setFormat7ROI(roi_left, roi_top, roi_width, roi_height);
541 bool *grab_color =
new bool[ncameras];
555 for (
unsigned int i = 0; i < ncameras; i++) {
557 g.setCamera(i + offset);
560 grab_color[i] = g.isColor();
564 std::cout <<
"Image size for camera " << i + offset <<
" : width: " << Ic[i].
getWidth()
565 <<
" height: " << Ic[i].
getHeight() << std::endl;
570 std::stringstream title;
571 title <<
"Images captured by camera ";
573 d[i].
init(Ic[i], (
int)(100 + i * 50), (
int)(100 + i * 50), title.str());
580 std::cout <<
"Image size for camera " << i + offset <<
" : width: " << Ig[i].
getWidth()
581 <<
" height: " << Ig[i].
getHeight() << std::endl;
586 std::stringstream title;
587 title <<
"Images captured by camera ";
589 d[i].
init(Ig[i], (
int)(100 + i * 50), (
int)(100 + i * 50), title.str());
598 std::cout <<
"Capture in process..." << std::endl;
600 double tbegin = 0, ttotal = 0;
604 for (
unsigned int i = 0; i < nframes; i++) {
605 for (
unsigned int c = 0; c < ncameras; c++) {
607 g.setCamera(c + offset);
629 char buf[FILENAME_MAX];
630 snprintf(buf, FILENAME_MAX, opath.c_str(), c + offset, i);
631 std::string filename(buf);
632 std::cout <<
"Write: " << filename << std::endl;
641 double tloop = tend - tbegin;
643 std::cout <<
"loop time: " << tloop <<
" ms" << std::endl;
647 std::cout <<
"Mean loop time: " << ttotal / nframes <<
" ms" << std::endl;
648 std::cout <<
"Mean frequency: " << 1000. / (ttotal / nframes) <<
" fps" << std::endl;
665 std::cout <<
"Catch an exception: " << e << std::endl;
672 std::cout <<
"This example requires dc1394 SDK. " << std::endl;
673 std::cout <<
"Tip if you are on a unix-like system:" << std::endl;
674 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...
void init(vpImage< unsigned char > &I, int win_x=-1, int win_y=-1, const std::string &win_title="")
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 int wait(double t0, double t)
VISP_EXPORT double measureTimeMs()