//-------------------------------------------------------------------- bool ofxVideoGrabberPtgrey::initGrabber(int w, int h, bool setUseTexture){ width = w; height = h; bUseTexture = setUseTexture; // In format_7 the framerate is set by setting the packet_size // this is used in dc1394_format7_set_roi() // The following formula is from the libdc1394 faq // http://damien.douxchamps.net/ieee1394/libdc1394/v2.x/faq/#How_can_I_work_out_the_packet_size_for_a_wanted_frame_rate float bus_period = 0.000125; // for firewire 400 int frame_rate = 60; int depth = 3; int num_packets = (int)(1.0/(bus_period*frame_rate) + 0.5); //packet_size = (width*height*depth + (num_packets*8) - 1)/(num_packets*8); packet_size = DC1394_USE_MAX_AVAIL; //first choose a device to use if( bChooseDevice ) { bool bFound = false; for (uint32_t index = 0; index < deviceList->num; index++) { if (deviceList->ids[index].unit == deviceID) { bFound = true; deviceID = deviceList->ids[index].guid; } } if (!bFound) { printf("initGrabber warning: Device ID for unit %x not found, using first device\n", deviceID); deviceID = deviceList->ids[0].guid; } } else if(deviceList->num > 0) { deviceID = deviceList->ids[0].guid; } else { ofLog(OF_LOG_ERROR, "in initGrabber, No cameras found"); } camera = dc1394_camera_new(driver, deviceID); if (!camera) { ofLog(OF_LOG_ERROR, "Failed to initialize camera with guid %x", deviceID); return 1; } /*----------------------------------------------------------------------- * setup capture *-----------------------------------------------------------------------*/ err = dc1394_video_set_iso_speed(camera, DC1394_ISO_SPEED_400); if( err != DC1394_SUCCESS ) { ofLog(OF_LOG_ERROR, "failed to set iso speed"); } err = dc1394_video_set_mode( camera, video_mode ); if( err != DC1394_SUCCESS ) { ofLog(OF_LOG_ERROR, "failed to set format 7 video mode"); } err = dc1394_format7_set_color_coding(camera, video_mode, color_coding); if( err != DC1394_SUCCESS ) { ofLog(OF_LOG_ERROR, "failed to set format 7 color coding"); } err = dc1394_format7_set_packet_size(camera, video_mode, packet_size); if( err != DC1394_SUCCESS ) { ofLog(OF_LOG_ERROR, "failed to set format 7 packet_size"); } err = dc1394_format7_set_roi(camera, video_mode, color_coding, packet_size, 0,0, width,height); if( err != DC1394_SUCCESS ) { ofLog(OF_LOG_ERROR, "failed to set format 7"); } //err = dc1394_video_set_framerate(camera, framerate); //DC1394_ERR_CLN_RTN(err,cleanup_and_exit(camera),"Could not set framerate"); err = dc1394_capture_setup(camera,2, DC1394_CAPTURE_FLAGS_DEFAULT); if( err != DC1394_SUCCESS ) { ofLog(OF_LOG_ERROR, "failed to setup dma capturing"); } /*----------------------------------------------------------------------- * set camera's features *-----------------------------------------------------------------------*/ err = dc1394_feature_set_mode(camera, DC1394_FEATURE_BRIGHTNESS, DC1394_FEATURE_MODE_MANUAL); err = dc1394_feature_set_value(camera, DC1394_FEATURE_BRIGHTNESS, 200); //1-255 err = dc1394_feature_set_mode(camera, DC1394_FEATURE_EXPOSURE, DC1394_FEATURE_MODE_MANUAL); err = dc1394_feature_set_value(camera, DC1394_FEATURE_EXPOSURE, 62); //7-62 err = dc1394_feature_set_mode(camera, DC1394_FEATURE_SHUTTER, DC1394_FEATURE_MODE_MANUAL); err = dc1394_feature_set_value(camera, DC1394_FEATURE_SHUTTER, 60); //1-263, 64 being the max for 60fps err = dc1394_feature_set_mode(camera, DC1394_FEATURE_GAIN, DC1394_FEATURE_MODE_MANUAL); err = dc1394_feature_set_value(camera, DC1394_FEATURE_GAIN, 50); //16-64 //err = dc1394_feature_set_mode(camera, DC1394_FEATURE_PAN, DC1394_FEATURE_MODE_MANUAL); //err = dc1394_feature_set_value(camera, DC1394_FEATURE_PAN, 56); /*----------------------------------------------------------------------- * report camera's features *-----------------------------------------------------------------------*/ err=dc1394_feature_get_all(camera,&features); if (err!=DC1394_SUCCESS) { dc1394_log_warning("Could not get feature set"); } else { dc1394_feature_print_all(&features, stdout); } /*----------------------------------------------------------------------- * have the camera start sending us data *-----------------------------------------------------------------------*/ err=dc1394_video_set_transmission(camera, DC1394_ON); //DC1394_ERR_CLN_RTN(err,cleanup_and_exit(camera),"Could not start camera iso transmission"); //create pixel buffer pixels = new unsigned char[width * height * 3]; //create texture if (bUseTexture) { tex.allocate(width,height,GL_LUMINANCE); memset(pixels, 0, width*height); tex.loadData(pixels, width, height, GL_LUMINANCE); } }
CameraIIDC::CameraIIDC(unsigned int camNum, CameraTriggerMode triggerMode) : Camera(triggerMode) { context = dc1394_new(); dc1394camera_list_t *camera_list; dc1394error_t err; err = dc1394_camera_enumerate(context, &camera_list); if(camNum+1 > camera_list->num){ cerr << "libdc1394: Selected camera is not available!"; return; } cam = NULL; cam = dc1394_camera_new(context, camera_list->ids[camNum].guid); if(!cam){ cerr << "libdc1394: Could not open camera!"; return; } dc1394_camera_free_list(camera_list); // // Get video modes // dc1394video_modes_t video_modes; // err=dc1394_video_get_supported_modes(cam, &video_modes); // DC1394_WRN(err,"Can't get video modes"); // // Select highest res mode // int i; // dc1394color_coding_t coding; // for (i=video_modes.num-1;i>=0;i--) { // if (!dc1394_is_video_mode_scalable(video_modes.modes[i])) { // dc1394_get_color_coding_from_video_mode(cam, video_modes.modes[i], &coding); // DC1394_WRN(err,"libdc1394: Could not get color coding"); // if (coding==DC1394_COLOR_CODING_MONO8) { // video_mode=video_modes.modes[i]; // break; // } // } // } // if (i < 0) { // cerr << "libdc1394: Could not get a valid gray scale mode!"; // return; // } // Select format 7 mode 0 video_mode = DC1394_VIDEO_MODE_FORMAT7_0; // Set bit depth err = dc1394_format7_set_color_coding(cam, video_mode, DC1394_COLOR_CODING_MONO8); if (err!=DC1394_SUCCESS) cerr << "libdc1394: Could not set video mode or color coding!"; // // Set video mode // err=dc1394_video_set_mode(cam, video_mode); // if (err!=DC1394_SUCCESS) // cerr << "libdc1394: Could not set video mode!"; // Setup capture err=dc1394_video_set_operation_mode(cam, DC1394_OPERATION_MODE_1394B); if (err!=DC1394_SUCCESS) cerr << "libdc1394: Could not set operation mode!"; err=dc1394_video_set_iso_speed(cam, DC1394_ISO_SPEED_800); if (err!=DC1394_SUCCESS) cerr << "libdc1394: Could not set iso speed!"; // Size of ringbuffer (Note: on OS X 10.9, size must be greater than 1) #ifdef __APPLE__ unsigned int bufferSize = 2; #else unsigned int bufferSize = 1; #endif err=dc1394_capture_setup(cam, bufferSize, DC1394_CAPTURE_FLAGS_DEFAULT); if (err!=DC1394_SUCCESS) cerr << "libdc1394: Could not set up camera!"; // Disable auto exposure mode dc1394_feature_set_power(cam, DC1394_FEATURE_EXPOSURE, DC1394_OFF); // Disable gamma mode dc1394_feature_set_power(cam, DC1394_FEATURE_GAMMA, DC1394_OFF); // Disable sharpness mode dc1394_feature_set_power(cam, DC1394_FEATURE_SHARPNESS, DC1394_OFF); // Disable frame-rate mode dc1394_feature_set_power(cam, DC1394_FEATURE_FRAME_RATE, DC1394_OFF); // Set manual settings dc1394_feature_set_mode(cam, DC1394_FEATURE_SHUTTER, DC1394_FEATURE_MODE_MANUAL); dc1394_feature_set_mode(cam, DC1394_FEATURE_GAIN, DC1394_FEATURE_MODE_MANUAL); // Set reasonable default settings CameraSettings settings; //settings.shutter = 8.333; settings.shutter = 16.66; settings.gain = 0.0; this->setCameraSettings(settings); // Print camera features and settings dc1394featureset_t features; err=dc1394_feature_get_all(cam, &features); DC1394_WRN(err, "libdc1394: Could not get feature set."); dc1394_feature_print_all(&features, stdout); fflush(stdout); return; }
Libdc1394SequenceGrabber::Libdc1394SequenceGrabber(const std::string& name, unsigned int w, unsigned int h, unsigned int rate) : cefix::SequenceGrabber(name, w, h, rate), _context(Libdc1394Context::get()), _camera(NULL), _firstFrame(true), _bayerMethod(DC1394_BAYER_METHOD_BILINEAR), _bayerPattern(DC1394_COLOR_FILTER_RGGB) { msg(osg::INFO) << "LibdcSequenceGrabber " << name << std::endl; setImage(new osg::ImageStream()); getImage()->setOrigin(osg::Image::TOP_LEFT); uint64_t uid = 0; bool grey = false; _format7 = false; int format_7_format_delta(0); if (name.empty() == false) { std::vector<std::string> parts; cefix::strTokenize(name,parts,":"); uid=cefix::hexToLong(parts[0]); for(unsigned int i = 1; i < parts.size(); ++i) { std::string part = cefix::strToLower(parts[i]); if (part == "grey") grey = true; else if (part == "format7") { _format7 = true; if (i+1 < parts.size()) { format_7_format_delta = atoi(parts[i+1].c_str()); ++i; } } } } if (_roi.height == 0) _roi.height = h; if (_roi.width == 0) _roi.width = w; initCamera(uid); if (_camera) { unsigned int video_mode(0); unsigned int color_mode(0); if (_format7) { video_mode = DC1394_VIDEO_MODE_FORMAT7_0+format_7_format_delta; color_mode = (!grey) ? DC1394_COLOR_CODING_RGB8 : DC1394_COLOR_CODING_MONO8; } if (!initVideoMode(w,h, grey, video_mode, color_mode)) { grey = !grey; msg(osg::INFO) << " could not find suitable video mode, toggling grey/color " << std::endl; if (!initVideoMode(w,h, grey)) { msg(osg::WARN) << "could not find suitable video mode for " << w << "x" << h << std::endl; } } initFrameRate(rate); dc1394error_t err; if (_format7) { err = dc1394_format7_set_color_coding(_camera, _videomode, (dc1394color_coding_t)color_mode); checkSuccess(err, "dc1394_format7_set_color_coding failed"); } if (_format7) { err = dc1394_format7_get_image_size(_camera, _videomode, &w, &h); checkSuccess(err, "dc1394_format7_get_image_size failed"); } else { err = dc1394_get_image_size_from_video_mode(_camera, _videomode, &w, &h); checkSuccess(err, "dc1394_get_image_size_from_video_mode failed"); } } if (grey) { getImage()->allocateImage(w,h,1,GL_LUMINANCE, GL_UNSIGNED_BYTE); } else { getImage()->allocateImage(w,h,1,GL_RGB, GL_UNSIGNED_BYTE); } _grey = grey; }