12 #include <mrpt/config.h>    16 #if MRPT_HAS_LIBDC1394_2    17 #include <dc1394/control.h>    18 #include <dc1394/conversions.h>    19 #include <dc1394/register.h>    20 #include <dc1394/utils.h>    27 #define THE_CAMERA static_cast<dc1394camera_t*>(m_dc1394camera)    28 #define THE_CONTEXT static_cast<dc1394_t*>(m_dc1394_lib_context)    33 CImageGrabber_dc1394::CImageGrabber_dc1394(
    34     uint64_t cameraGUID, uint16_t cameraUnit,
    40 #if MRPT_HAS_LIBDC1394_2    46     dc1394camera_list_t* list;
    50     if (err != DC1394_SUCCESS)
    52         cerr << 
"[CImageGrabber_dc1394] ERROR: Failed to enumerate cameras "    53                 "(Maybe your user has no rights to access IEEE1394?)."    60         cerr << 
"[CImageGrabber_dc1394] ERROR: No cameras found." << endl;
    71             dc1394_camera_free_list(list);
    72             cerr << 
"[CImageGrabber_dc1394] ERROR: Failed to initialize camera "    74                  << list->ids[0].guid << 
"\n";
    81         for (uint32_t i = 0; i < list->num; i++)
    83             if (list->ids[i].guid == cameraGUID &&
    84                 list->ids[i].unit == cameraUnit)
    87                     dc1394_camera_new_unit(
THE_CONTEXT, cameraGUID, cameraUnit);
    90                     dc1394_camera_free_list(list);
    91                     cerr << 
"[CImageGrabber_dc1394] ERROR: Failed to "    92                             "initialize camera with GUID "    93                          << list->ids[0].guid << 
"\n";
   102             dc1394_camera_free_list(list);
   103             cerr << 
"[CImageGrabber_dc1394] ERROR: Camera with GUID="   104                  << cameraGUID << 
" and UNIT=" << cameraUnit << 
" not found.\n";
   108     dc1394_camera_free_list(list);
   117     dc1394video_modes_t modes;
   118     err = dc1394_video_get_supported_modes(
THE_CAMERA, &modes);
   119     if (err != DC1394_SUCCESS)
   121         cerr << 
"[CImageGrabber_dc1394] ERROR: Could not get list of modes."   127     if (options.
mode7 >= 0)
   131             cout << 
"[CImageGrabber_dc1394] Mode is mode7: " << options.
mode7   136 #define TEST_MODE(W, H, COLORMODEL)                                         \   138         options.frame_width == W && options.frame_height == H &&            \   139         options.color_coding == COLOR_CODING_##COLORMODEL) m_desired_mode = \   140         DC1394_VIDEO_MODE_##W##x##H##_##COLORMODEL;   145         TEST_MODE(160, 120, YUV444)
   146         TEST_MODE(320, 240, YUV422)
   147         TEST_MODE(640, 480, YUV411)
   148         TEST_MODE(640, 480, YUV422)
   149         TEST_MODE(640, 480, RGB8)
   150         TEST_MODE(640, 480, MONO8)
   151         TEST_MODE(640, 480, MONO16)
   152         TEST_MODE(800, 600, YUV422)
   153         TEST_MODE(800, 600, RGB8)
   154         TEST_MODE(800, 600, MONO8)
   155         TEST_MODE(800, 600, MONO16)
   156         TEST_MODE(1024, 768, YUV422)
   157         TEST_MODE(1024, 768, RGB8)
   158         TEST_MODE(1024, 768, MONO8)
   159         TEST_MODE(1024, 768, MONO16)
   160         TEST_MODE(1280, 960, YUV422)
   161         TEST_MODE(1280, 960, RGB8)
   162         TEST_MODE(1280, 960, MONO8)
   163         TEST_MODE(1280, 960, MONO16)
   164         TEST_MODE(1600, 1200, YUV422)
   165         TEST_MODE(1600, 1200, RGB8)
   166         TEST_MODE(1600, 1200, MONO8)
   167         TEST_MODE(1600, 1200, MONO16)
   170     if (
verbose) cout << 
"------ Supported video modes ------" << endl;
   171     bool valid_video_mode = 
false;
   172     for (uint32_t i = 0; i < modes.num; i++)
   175         switch (modes.modes[i])
   177             case DC1394_VIDEO_MODE_160x120_YUV444:
   178                 mode = 
"160x120_YUV444";
   180             case DC1394_VIDEO_MODE_320x240_YUV422:
   181                 mode = 
"320x240_YUV422";
   183             case DC1394_VIDEO_MODE_640x480_YUV411:
   184                 mode = 
"640x480_YUV411";
   186             case DC1394_VIDEO_MODE_640x480_YUV422:
   187                 mode = 
"640x480_YUV422";
   189             case DC1394_VIDEO_MODE_640x480_RGB8:
   190                 mode = 
"640x480_RGB8";
   192             case DC1394_VIDEO_MODE_640x480_MONO8:
   193                 mode = 
"640x480_MONO8";
   195             case DC1394_VIDEO_MODE_640x480_MONO16:
   196                 mode = 
"640x480_MONO16";
   198             case DC1394_VIDEO_MODE_800x600_YUV422:
   199                 mode = 
"800x600_YUV422";
   201             case DC1394_VIDEO_MODE_800x600_RGB8:
   202                 mode = 
"800x600_RGB8";
   204             case DC1394_VIDEO_MODE_800x600_MONO8:
   205                 mode = 
"800x600_MONO8";
   207             case DC1394_VIDEO_MODE_1024x768_YUV422:
   208                 mode = 
"1024x768_YUV422";
   210             case DC1394_VIDEO_MODE_1024x768_RGB8:
   211                 mode = 
"1024x768_RGB8";
   213             case DC1394_VIDEO_MODE_1024x768_MONO8:
   214                 mode = 
"1024x768_MONO8";
   216             case DC1394_VIDEO_MODE_800x600_MONO16:
   217                 mode = 
"800x600_MONO16";
   219             case DC1394_VIDEO_MODE_1024x768_MONO16:
   220                 mode = 
"1024x768_MONO16";
   222             case DC1394_VIDEO_MODE_1280x960_YUV422:
   223                 mode = 
"1280x960_YUV422";
   225             case DC1394_VIDEO_MODE_1280x960_RGB8:
   226                 mode = 
"1280x960_RGB8";
   228             case DC1394_VIDEO_MODE_1280x960_MONO8:
   229                 mode = 
"1280x960_MONO8";
   231             case DC1394_VIDEO_MODE_1600x1200_YUV422:
   232                 mode = 
"1600x1200_YUV422";
   234             case DC1394_VIDEO_MODE_1600x1200_RGB8:
   235                 mode = 
"1600x1200_RGB8";
   237             case DC1394_VIDEO_MODE_1600x1200_MONO8:
   238                 mode = 
"1600x1200_MONO8";
   240             case DC1394_VIDEO_MODE_1280x960_MONO16:
   241                 mode = 
"1280x960_MONO16";
   243             case DC1394_VIDEO_MODE_1600x1200_MONO16:
   244                 mode = 
"1600x1200_MONO16";
   246             case DC1394_VIDEO_MODE_EXIF:
   249             case DC1394_VIDEO_MODE_FORMAT7_0:
   252             case DC1394_VIDEO_MODE_FORMAT7_1:
   255             case DC1394_VIDEO_MODE_FORMAT7_2:
   258             case DC1394_VIDEO_MODE_FORMAT7_3:
   261             case DC1394_VIDEO_MODE_FORMAT7_4:
   264             case DC1394_VIDEO_MODE_FORMAT7_5:
   267             case DC1394_VIDEO_MODE_FORMAT7_6:
   270             case DC1394_VIDEO_MODE_FORMAT7_7:
   274                 cerr << 
"[CImageGrabber_dc1394] ERROR: Requested video mode is "   283                 cout << mode << 
" (*)" << endl;
   285                 cout << mode << endl;
   288     if (!valid_video_mode)
   291                     "[CImageGrabber_dc1394] ERROR: Requested mode %ix%i "   292                     "color_model:%i is not available for this camera.",
   313     err = dc1394_video_set_iso_speed(
THE_CAMERA, DC1394_ISO_SPEED_400);
   314     if (err != DC1394_SUCCESS)
   316         cerr << 
"[CImageGrabber_dc1394] ERROR: Could not set iso speed."   324     if (err != DC1394_SUCCESS)
   326         cerr << 
"[CImageGrabber_dc1394] ERROR: Could not set video mode."   331     dc1394framerate_t the_framerate;
   335             the_framerate = DC1394_FRAMERATE_1_875;
   338             the_framerate = DC1394_FRAMERATE_3_75;
   341             the_framerate = DC1394_FRAMERATE_7_5;
   344             the_framerate = DC1394_FRAMERATE_15;
   347             the_framerate = DC1394_FRAMERATE_30;
   350             the_framerate = DC1394_FRAMERATE_60;
   353             the_framerate = DC1394_FRAMERATE_120;
   356             the_framerate = DC1394_FRAMERATE_240;
   360             cerr << 
"[CImageGrabber_dc1394] ERROR: Requested framerate is not "   366     err = dc1394_video_set_framerate(
THE_CAMERA, the_framerate);
   367     if (err != DC1394_SUCCESS)
   369         cerr << 
"[CImageGrabber_dc1394] ERROR: Could not set framerate."   374     err = dc1394_capture_setup(
   375         THE_CAMERA, SIZE_RING_BUFFER, DC1394_CAPTURE_FLAGS_DEFAULT);
   376     if (err != DC1394_SUCCESS)
   378         cerr << 
"[CImageGrabber_dc1394] ERROR: Could not setup camera-\nmake "   379                 "sure that the video mode and framerate are\nsupported by your "   385     cout << 
"------ Other options ------" << endl;
   387     if ((err = dc1394_video_get_iso_channel(
THE_CAMERA, &iso_chan)) ==
   389         if (
verbose) cout << 
"ISO Channel: " << iso_chan << endl;
   391     dc1394speed_t iso_speed;
   392     if ((err = dc1394_video_get_iso_speed(
THE_CAMERA, &iso_speed)) ==
   394         if (
verbose) cout << 
"ISO Speed: " << iso_speed << endl;
   397 #define SET_TRIGGER(opt, OPT, TYPE)                                       \   398     if (options.trigger_##opt >= 0)                                       \   400         err = dc1394_external_trigger_set_##opt(                          \   402             static_cast<dc1394trigger_##opt##_t>(                         \   403                 DC1394_TRIGGER_##TYPE##_MIN + options.trigger_##opt));    \   406             "[CImageGrabber_dc1394::changeCaptureOptions] Could not set " \   409     SET_TRIGGER(mode, MODE, MODE)
   410     SET_TRIGGER(source, SOURCE, SOURCE)
   411     SET_TRIGGER(polarity, POLARITY, ACTIVE)
   414         err = dc1394_external_trigger_set_power(
   418             "[CImageGrabber_dc1394::changeCaptureOptions] Could not set "   426     err = dc1394_video_set_transmission(
THE_CAMERA, DC1394_ON);
   427     if (err != DC1394_SUCCESS)
   429         cerr << 
"[CImageGrabber_dc1394] ERROR: Could not start camera iso "   443         dc1394featureset_t features;
   444         if ((err = dc1394_feature_get_all(
THE_CAMERA, &features)) ==
   446             dc1394_feature_print_all(&features, stdout);
   451         "[CImageGrabber_dc1394] ERROR: MRPT compiled with "   452         "MRPT_HAS_LIBDC1394_2=0 !");
   462 #if MRPT_HAS_LIBDC1394_2   466         dc1394_video_set_transmission(
THE_CAMERA, DC1394_OFF);
   497 #if MRPT_HAS_LIBDC1394_2   498     dc1394video_frame_t* frame = 
nullptr;
   501     err = dc1394_video_set_transmission(
THE_CAMERA, DC1394_ON);
   502     if (err != DC1394_SUCCESS)
   504         cerr << 
"[CImageGrabber_dc1394] ERROR: Could not start camera iso "   512         dc1394_capture_dequeue(
THE_CAMERA, DC1394_CAPTURE_POLICY_WAIT, &frame);
   515     if (err != DC1394_SUCCESS)
   517         cerr << 
"[CImageGrabber_dc1394] ERROR: Could not capture a frame"   524     const unsigned int width = frame->size[0];
   525     const unsigned int height = frame->size[1];
   535         auto* new_frame = 
static_cast<dc1394video_frame_t*
>(
   536             calloc(1, 
sizeof(dc1394video_frame_t)));
   537         new_frame->color_coding = DC1394_COLOR_CODING_RGB8;
   538         dc1394_convert_frames(frame, new_frame);
   542             width, height, 
true, new_frame->image, 
true );
   545         free(new_frame->image);
   553         auto* imageBuf = 
new uint8_t[width * height * 2];
   554         auto* imageBufRGB = 
new uint8_t[width * height * 2 * 3];
   556         if ((err = dc1394_deinterlace_stereo(
   557                  frame->image, imageBuf, width, 2 * height)) != DC1394_SUCCESS)
   559             cerr << 
"[CImageGrabber_dc1394] ERROR: Could not deinterlace "   565         if ((err = dc1394_bayer_decoding_8bit(
   566                  imageBuf, imageBufRGB, width, 2 * height,
   567                  DC1394_COLOR_FILTER_GBRG,  
   569                  DC1394_BAYER_METHOD_HQLINEAR)) != DC1394_SUCCESS)
   571             cerr << 
"[CImageGrabber_dc1394] ERROR: Could not apply Bayer "   578             width, height, 
true, imageBufRGB);  
   583         delete[] imageBufRGB;
   587     err = dc1394_capture_enqueue(
THE_CAMERA, frame);
   588     if (err != DC1394_SUCCESS)
   590         cerr << 
"[CImageGrabber_dc1394] ERROR: Could not enqueue the ring "   598     THROW_EXCEPTION(
"The MRPT has been compiled with MRPT_HAS_LIBDC1394_2=0 !");
   613 #if MRPT_HAS_LIBDC1394_2   614     dc1394video_frame_t* frame = 
nullptr;
   618         dc1394_capture_dequeue(
THE_CAMERA, DC1394_CAPTURE_POLICY_WAIT, &frame);
   619     if (err != DC1394_SUCCESS)
   621         cerr << 
"[CImageGrabber_dc1394] ERROR: Could not capture a frame"   628     const unsigned int width = frame->size[0];
   629     const unsigned int height = frame->size[1];
   634             "Call to getObservation(stereo) but the camera was not set as "   642         auto* imageBuf = 
new uint8_t[width * height * 2];
   643         auto* imageBufRGB = 
new uint8_t[width * height * 2 * 3];
   645         if ((err = dc1394_deinterlace_stereo(
   646                  frame->image, imageBuf, width, 2 * height)) != DC1394_SUCCESS)
   648             cerr << 
"[CImageGrabber_dc1394] ERROR: Could not deinterlace "   654         if ((err = dc1394_bayer_decoding_8bit(
   655                  imageBuf, imageBufRGB, width, 2 * height,
   656                  DC1394_COLOR_FILTER_GBRG,  
   658                  DC1394_BAYER_METHOD_HQLINEAR)) != DC1394_SUCCESS)
   660             cerr << 
"[CImageGrabber_dc1394] ERROR: Could not apply Bayer "   667             width, height, 
true, imageBufRGB);  
   670             imageBufRGB + width * height * 3);  
   673         delete[] imageBufRGB;
   681     THROW_EXCEPTION(
"The MRPT has been compiled with MRPT_HAS_LIBDC1394_2=0 !");
   696 #if MRPT_HAS_LIBDC1394_2   699 #define SET_MODE(feat, FEAT)                                                   \   700     if (options.feat##_mode >= 0)                                              \   702         err = dc1394_feature_set_mode(                                         \   703             THE_CAMERA, DC1394_FEATURE_##FEAT,                                 \   704             static_cast<dc1394feature_mode_t>(                                 \   705                 DC1394_FEATURE_MODE_MIN + options.feat##_mode));               \   708             "[CImageGrabber_dc1394::changeCaptureOptions] Could not set feat " \   711     SET_MODE(shutter, SHUTTER)
   713     SET_MODE(gamma, GAMMA)
   714     SET_MODE(brightness, BRIGHTNESS)
   715     SET_MODE(exposure, EXPOSURE)
   716     SET_MODE(sharpness, SHARPNESS)
   717     SET_MODE(white_balance, WHITE_BALANCE)
   721 #define SET_VALUE(feat, FEAT)                                                  \   722     if (options.feat >= 0)                                                     \   724         err = dc1394_feature_set_value(                                        \   725             THE_CAMERA, DC1394_FEATURE_##FEAT, options.feat);                  \   728             "[CImageGrabber_dc1394::changeCaptureOptions] Could not set feat " \   731     SET_VALUE(shutter, SHUTTER)
   732     SET_VALUE(gain, GAIN)
   733     SET_VALUE(gamma, GAMMA)
   734     SET_VALUE(brightness, BRIGHTNESS)
   735     SET_VALUE(exposure, EXPOSURE)
   736     SET_VALUE(sharpness, SHARPNESS)
   737     SET_VALUE(white_balance, WHITE_BALANCE)
   742     THROW_EXCEPTION(
"The MRPT has been compiled with MRPT_HAS_LIBDC1394_2=0 !");
   756 #if MRPT_HAS_LIBDC1394_2   758     err = dc1394_software_trigger_set_power(
THE_CAMERA, (dc1394switch_t)level);
   761         "[CImageGrabber_dc1394::setSoftwareTriggerLevel] Could not set "   762         "software trigger level");
   766     THROW_EXCEPTION(
"The MRPT has been compiled with MRPT_HAS_LIBDC1394_2=0 !");
   778 #if MRPT_HAS_LIBDC1394_2   780     dc1394_t* lib_context = 
nullptr;
   781     dc1394camera_list_t* list = 
nullptr;
   786         lib_context = dc1394_new();
   788             throw std::runtime_error(
   789                 "[CImageGrabber_dc1394] ERROR: Failed to enumerate cameras "   790                 "(Maybe your user has no rights to access IEEE1394?).");
   795         err = dc1394_camera_enumerate(lib_context, &list);
   796         if (err != DC1394_SUCCESS)
   797             throw std::runtime_error(
   798                 "[CImageGrabber_dc1394] ERROR: Failed to enumerate cameras "   799                 "(Maybe your user has no rights to access IEEE1394?).");
   801         for (
unsigned int i = 0; i < list->num; i++)
   805             info.
guid = list->ids[i].guid;
   806             info.
unit = list->ids[i].unit;
   809             dc1394camera_t* cam = dc1394_camera_new_unit(
   810                 lib_context, list->ids[i].guid, list->ids[i].unit);
   812                 throw std::runtime_error(
format(
   813                     "[CImageGrabber_dc1394] ERROR: Failed to query camera "   815                     static_cast<unsigned int>(list->ids[i].guid)));
   827             for (
int j = 0; j < DC1394_VIDEO_MODE_FORMAT7_NUM; j++)
   830             info.
vendor = std::string(cam->vendor ? cam->vendor : 
"");
   831             info.
model = std::string(cam->model ? cam->model : 
"");
   844             dc1394_camera_free(cam);  
   846             out_list.push_back(info);
   850         dc1394_free(lib_context);
   851         lib_context = 
nullptr;
   852         dc1394_camera_free_list(list);
   857         if (list) dc1394_camera_free_list(list);
   858         if (lib_context) dc1394_free(lib_context);
   862     THROW_EXCEPTION(
"The MRPT has been compiled with MRPT_HAS_LIBDC1394_2=0 !");
 
std::list< TCameraInfo > TCameraInfoList
 
Declares a class derived from "CObservation" that encapsules an image from a camera, whose relative pose to robot is also stored. 
 
Options used when creating an dc1394 capture object All but the frame size, framerate, and color_coding can be changed dynamically by CImageGrabber_dc1394::changeCaptureOptions. 
 
virtual ~CImageGrabber_dc1394()
Destructor. 
 
mrpt::img::CImage imageLeft
Image from the left camera (this image will be ALWAYS present) 
 
uint64_t strobe_control_csr
 
#define THROW_EXCEPTION(msg)
 
std::string std::string format(std::string_view fmt, ARGS &&... args)
 
static void enumerateCameras(TCameraInfoList &out_list)
Generates a list with the information on all the existing (Firewire) cameras in the system...
 
bool deinterlace_stereo
For stereo cameras (eg PR Bumblebee) 
 
mrpt::system::TTimeStamp now()
A shortcut for system::getCurrentTime. 
 
Contains classes for various device interfaces. 
 
bool getObservation(mrpt::obs::CObservationImage &out_observation)
Grab an image from the opened camera (for monocular cameras). 
 
bool setSoftwareTriggerLevel(bool level)
Changes the boolean level associated to Software Trigger (ON/OFF) Can be used to control camera trigg...
 
uint64_t advanced_features_csr
 
TCaptureOptions_dc1394 m_options
 
#define ASSERT_(f)
Defines an assertion mechanism. 
 
uint32_t unit_sub_sw_version
 
mrpt::img::CImage image
The image captured by the camera, that is, the main piece of information of this observation. 
 
uint32_t unit_dependent_directory
 
Observation class for either a pair of left+right or left+disparity images from a stereo camera...
 
int frame_width
Capture resolution (Default: 640x480) 
 
bool has_feature_error_status
 
void * m_dc1394_lib_context
Internal use: 
 
grabber_dc1394_color_coding_t color_coding
 
bool changeCaptureOptions(const TCaptureOptions_dc1394 &options)
Changes the capture properties (brightness, gain, shutter, etc) The frame size, framerate, and color_coding fields in options are ignored since they can be only set at construction time. 
 
grabber_dc1394_framerate_t framerate
 
This is the global namespace for all Mobile Robot Programming Toolkit (MRPT) libraries. 
 
mrpt::system::TTimeStamp timestamp
The associated UTC time-stamp. 
 
Used in enumerateCameras. 
 
bool has_vmode_error_status
 
uint32_t command_registers_base
 
int ring_buffer_size
Size of the libdc1394 ring buffer. 
 
bool m_bInitialized
Set to false if we could not initialize the camera. 
 
int mode7
-1: Normal mode, i>=0: use MODE7_i, then frame_width/height and color_coding are ignored. 
 
mrpt::img::CImage imageRight
Image from the right camera, only contains a valid image if hasImageRight == true. 
 
void loadFromMemoryBuffer(unsigned int width, unsigned int height, bool color, unsigned char *rawpixels, bool swapRedBlue=false)
Reads the image from raw pixels buffer in memory. 
 
#define THROW_STACKED_EXCEPTION