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:"
88 void 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());
245 bool 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],
nullptr, camera, nframes, opath, roi_left, roi_top, roi_width, roi_height, ringbuffersize,
328 if ((c == 1) || (c == -1)) {
330 usage(argv[0],
nullptr, 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;
347 int 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) ==
false) {
392 unsigned int ncameras = 0;
393 g.getNumCameras(ncameras);
395 std::cout <<
"Number of cameras on the bus: " << ncameras << std::endl;
401 std::cout <<
"You have only " << ncameras <<
" camera connected on the bus." << std::endl;
402 std::cout <<
"It is not possible to active multi-camera acquisition." << std::endl;
403 std::cout <<
"Disable -m command line option, or connect an other " << std::endl;
404 std::cout <<
"cameras on the bus." << std::endl;
409 if (camera >= ncameras) {
410 std::cout <<
"You have only " << ncameras;
411 std::cout <<
" camera connected on the bus." << std::endl;
412 std::cout <<
"It is not possible to select camera " << camera << std::endl;
413 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 std::stringstream ss;
469 if (curmode == supmode)
476 if (g.isVideoModeFormat7(supmode)) {
479 g.getColorCodingSupported(supmode, lcoding);
480 for (it_lcoding = lcoding.begin(); it_lcoding != lcoding.end(); ++it_lcoding) {
482 supcoding = *it_lcoding;
483 std::stringstream ss;
484 ss << (int)supcoding;
485 if ((curmode == supmode) && (supcoding == curcoding))
496 g.getFramerateSupported(supmode, lfps);
497 for (it_lfps = lfps.begin(); it_lfps != lfps.end(); ++it_lfps) {
499 std::stringstream ss;
501 if ((curmode == supmode) && (supfps == curfps))
510 std::cout <<
"----------------------------------------------------------" << std::endl;
518 if (panControl_is_set) {
519 g.setPanControl(panControl);
523 if (videomode_is_set) {
525 g.setVideoMode(videomode);
530 g.getVideoMode(videomode);
532 if (framerate_is_set) {
534 g.setFramerate(framerate);
536 if (colorcoding_is_set) {
538 g.setColorCoding(colorcoding);
540 if (ringbuffersize_is_set) {
541 g.setRingBufferSize(ringbuffersize);
545 if (g.isVideoModeFormat7(videomode))
546 g.setFormat7ROI(roi_left, roi_top, roi_width, roi_height);
549 bool *grab_color =
new bool[ncameras];
563 for (
unsigned int i = 0; i < ncameras; i++) {
565 g.setCamera(i + offset);
568 grab_color[i] = g.isColor();
572 std::cout <<
"Image size for camera " << i + offset <<
" : width: " << Ic[i].
getWidth()
573 <<
" height: " << Ic[i].
getHeight() << std::endl;
578 std::stringstream title;
579 title <<
"Images captured by camera ";
581 d[i].
init(Ic[i], (
int)(100 + i * 50), (
int)(100 + i * 50), title.str());
589 std::cout <<
"Image size for camera " << i + offset <<
" : width: " << Ig[i].
getWidth()
590 <<
" height: " << Ig[i].
getHeight() << std::endl;
595 std::stringstream title;
596 title <<
"Images captured by camera ";
598 d[i].
init(Ig[i], (
int)(100 + i * 50), (
int)(100 + i * 50), title.str());
607 std::cout <<
"Capture in process..." << std::endl;
609 double tbegin = 0, ttotal = 0;
613 for (
unsigned int i = 0; i < nframes; i++) {
614 for (
unsigned int c = 0; c < ncameras; c++) {
616 g.setCamera(c + offset);
639 char buf[FILENAME_MAX];
640 snprintf(buf, FILENAME_MAX, opath.c_str(), c + offset, i);
641 std::string filename(buf);
642 std::cout <<
"Write: " << filename << std::endl;
652 double tloop = tend - tbegin;
654 std::cout <<
"loop time: " << tloop <<
" ms" << std::endl;
658 std::cout <<
"Mean loop time: " << ttotal / nframes <<
" ms" << std::endl;
659 std::cout <<
"Mean frequency: " << 1000. / (ttotal / nframes) <<
" fps" << std::endl;
677 std::cout <<
"Catch an exception: " << e << std::endl;
684 std::cout <<
"This example requires dc1394 SDK. " << std::endl;
685 std::cout <<
"Tip if you are on a unix-like system:" << std::endl;
686 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="") 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)
void display(vpImage< unsigned char > &I, const std::string &title)
Display a gray-scale image.
VISP_EXPORT int wait(double t0, double t)
VISP_EXPORT double measureTimeMs()