// cvSetCaptureProperty callback function implementation static int icvSetPropertyCAM_DC1394( CvCaptureCAM_DC1394* capture, int property_id, double value ){ _V_MW_ fprintf(stderr,"icvSetPropertyCAM_DC1394\n"); int index=-1; switch ( property_id ) { case CV_CAP_PROP_CONVERT_RGB: return icvSetConvertRGB( capture, value != 0 ); case CV_CAP_PROP_MODE: return icvSetModeCAM_DC1394( capture, (int) value ); case CV_CAP_PROP_FPS: return icvSetFrameRateCAM_DC1394( capture, value ); case CV_CAP_PROP_BRIGHTNESS: index = FEATURE_BRIGHTNESS; break; case CV_CAP_PROP_CONTRAST: index = FEATURE_GAMMA; break; case CV_CAP_PROP_SATURATION: index = FEATURE_SATURATION; break; case CV_CAP_PROP_HUE: index = FEATURE_HUE; break; case CV_CAP_PROP_GAIN: index = FEATURE_GAIN; break; default: index = property_id; // did they pass in a LIBDC1394 feature flag? break; } if(value == -1) { // special case for setting AUTO if(index>=FEATURE_MIN && index<=FEATURE_MAX){ return icvSetFeatureCAM_DC1394(capture, index, -1 ); } else return -1; } else { // manual settings /* limitation of the input value */ if (value < 0.0) { value = 0.0; } else if (value > 1.0) { value = 1.0; } unsigned int minval=0, maxval=0; if(dc1394_get_min_value( ((CvCaptureCAM_DC1394 *)capture)->handle, ((CvCaptureCAM_DC1394 *)capture)->camera->node, index, &minval) == DC1394_FAILURE){ fprintf(stderr, "error getting min %d value\n", index); return -1; } if(dc1394_get_max_value( ((CvCaptureCAM_DC1394 *)capture)->handle, ((CvCaptureCAM_DC1394 *)capture)->camera->node, index, &maxval) == DC1394_FAILURE){ fprintf(stderr, "error getting max %d value\n", index); return -1; } if(index>=FEATURE_MIN && index<=FEATURE_MAX){ return icvSetFeatureCAM_DC1394(capture, index, (int)(value * (maxval - minval) + minval) ); } else return -1; } }
// function to set camera properties using dc1394 feature enum // val == -1 indicates to set this property to 'auto' static int icvSetFeatureCAM_DC1394( CvCaptureCAM_DC1394* capture, int feature_id, int val){ dc1394bool_t isOn = DC1394_FALSE; dc1394bool_t hasAutoCapability = DC1394_FALSE; dc1394bool_t isAutoOn = DC1394_FALSE; unsigned int nval; unsigned int minval,maxval; // Turn the feature on if it is OFF if( dc1394_is_feature_on(capture->handle, capture->camera->node, feature_id, &isOn) == DC1394_FAILURE ) { return 0; } if( isOn == DC1394_FALSE ) { // try to turn it on. if( dc1394_feature_on_off(capture->handle, capture->camera->node, feature_id, 1) == DC1394_FAILURE ) { fprintf(stderr, "error turning feature %d on!\n", feature_id); return 0; } } // Check if the feature supports auto mode dc1394_has_auto_mode(capture->handle, capture->camera->node, feature_id, &hasAutoCapability); if( hasAutoCapability ) { // now check if the auto is on. if( dc1394_is_feature_auto(capture->handle, capture->camera->node, feature_id, &isAutoOn ) == DC1394_FAILURE ) { fprintf(stderr, "error determining if feature %d has auto on!\n", feature_id); return 0; } } // Caller requested auto mode, but cannot support it else if(val==-1){ fprintf(stderr, "feature %d does not support auto mode\n", feature_id); return 0; } if(val==-1){ // if the auto mode isn't enabled, enable it if( isAutoOn == DC1394_FALSE ) { if(dc1394_auto_on_off(capture->handle, capture->camera->node, feature_id, 1) == DC1394_FAILURE ) { fprintf(stderr, "error turning feature %d auto ON!\n", feature_id); return 0; } } return 1; } // ELSE turn OFF auto and adjust feature manually if( isAutoOn == DC1394_TRUE ) { if(dc1394_auto_on_off(capture->handle, capture->camera->node, feature_id, 0) == DC1394_FAILURE ) { fprintf(stderr, "error turning feature %d auto OFF!\n", feature_id); return 0; } } // Clamp val to within feature range CV_DC1394_CALL( dc1394_get_min_value(capture->handle, capture->camera->node, feature_id, &minval)); CV_DC1394_CALL( dc1394_get_max_value(capture->handle, capture->camera->node, feature_id, &maxval)); val = (int)MIN(maxval, MAX((unsigned)val, minval)); if (dc1394_set_feature_value(capture->handle, capture->camera->node, feature_id, val) == DC1394_FAILURE){ fprintf(stderr, "error setting feature value\n"); return 0; } if (dc1394_get_feature_value(capture->handle, capture->camera->node, feature_id, &nval) == DC1394_FAILURE){ fprintf(stderr, "error setting feature value\n"); return 0; } return nval==(unsigned int)val; }
static double icvGetPropertyCAM_DC1394( CvCaptureCAM_DC1394* capture, int property_id ){ _V_MW_ fprintf(stderr,"icvGetPropertyCAM_DC1394\n"); unsigned int index=0; unsigned int mval=0; unsigned int minval=0; unsigned int maxval=0; switch ( property_id ) { default: return -1; case CV_CAP_PROP_FRAME_HEIGHT: return ((CvCaptureCAM_DC1394 *)capture)->camera->frame_height; case CV_CAP_PROP_FRAME_WIDTH: return ((CvCaptureCAM_DC1394 *)capture)->camera->frame_width; case CV_CAP_PROP_CONVERT_RGB: return capture->convert; case CV_CAP_PROP_MODE: return capture->mode; case CV_CAP_PROP_FORMAT: return capture->format; case CV_CAP_PROP_FPS: dc1394_get_video_framerate(capture->handle, capture->camera->node, (unsigned int *) &capture->camera->frame_rate); switch(capture->camera->frame_rate) { default: return -1; case FRAMERATE_1_875: return 1.875; case FRAMERATE_3_75: return 3.75; case FRAMERATE_7_5: return 7.5; case FRAMERATE_15: return 15.; case FRAMERATE_30: return 30.; case FRAMERATE_60: return 60; #if NUM_FRAMERATES > 6 case FRAMERATE_120: return 120; #endif #if NUM_FRAMERATES > 7 case FRAMERATE_240: return 240; #endif } case CV_CAP_PROP_BRIGHTNESS: index = FEATURE_BRIGHTNESS; break; case CV_CAP_PROP_CONTRAST: index = FEATURE_GAMMA; break; case CV_CAP_PROP_SATURATION: index = FEATURE_SATURATION; break; case CV_CAP_PROP_HUE: index = FEATURE_HUE; break; case CV_CAP_PROP_GAIN: index = FEATURE_GAIN; break; } if(dc1394_get_min_value( ((CvCaptureCAM_DC1394 *)capture)->handle, ((CvCaptureCAM_DC1394 *)capture)->camera->node, index, &minval) == DC1394_FAILURE){ fprintf(stderr, "error getting min %d value\n", index); return -1; } if(dc1394_get_max_value( ((CvCaptureCAM_DC1394 *)capture)->handle, ((CvCaptureCAM_DC1394 *)capture)->camera->node, index, &maxval) == DC1394_FAILURE){ fprintf(stderr, "error getting max %d value\n", index); return -1; } if(dc1394_get_feature_value( ((CvCaptureCAM_DC1394 *)capture)->handle, ((CvCaptureCAM_DC1394 *)capture)->camera->node, index, &mval) == DC1394_FAILURE){ fprintf(stderr, "error getting feature %d value\n", index); return -1; } if(maxval == minval) return -1; return ((double)mval - minval)/(maxval - minval); }