Пример #1
0
// 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;

}
Пример #3
0
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);
  
}