LinuxDC1394CameraController.cpp
上传用户:lijia5631
上传日期:2008-11-10
资源大小:1214k
文件大小:5k
源码类别:

视频捕捉/采集

开发平台:

MultiPlatform

  1. #include "LinuxDC1394CameraController.h"
  2. #if 0
  3. LinuxDC1394CameraController::LinuxDC1394CameraController()
  4.   : m_handle(NULL),
  5.     m_can_control_exposure(false),
  6.     m_can_control_gain(false),
  7.     m_initialized(false)
  8. {
  9.   m_initialized = true;
  10.   // get handle to dc1394 interface
  11.   m_handle = dc1394_create_handle(0);
  12.   if (m_handle==NULL) {
  13.     fprintf(stderr, "can't create handlen");
  14.     return;
  15.   }
  16.   // get the first camera on the interface
  17.   
  18.   int numCameras;
  19.   int showCameras = 0; // don't print info
  20.   nodeid_t* nodes =
  21.     dc1394_get_camera_nodes(m_handle, &numCameras, showCameras);
  22.   if (numCameras==-1 || nodes==NULL) {
  23.     fprintf(stderr, "can't get camerasn");
  24.     return;
  25.   }
  26.   m_node = nodes[0];
  27.   // init might not be necessary
  28.   int success = dc1394_init_camera(m_handle, m_node);
  29.   if (success!=DC1394_SUCCESS) {
  30.     fprintf(stderr, "can not init cameran");  
  31.     return;
  32.   }
  33.   // debug stuff
  34.   //  dc1394_camerainfo cinfo;
  35.   //  dc1394_print_camera_info(&cinfo);
  36.  
  37.   // query for manual exposure availability
  38.   dc1394_feature_info info;
  39.   info.feature_id = FEATURE_EXPOSURE;
  40.   dc1394_get_camera_feature(m_handle, m_node, &info);
  41.   //  dc1394_print_feature(&info);
  42.   if (info.manual_capable != DC1394_TRUE) {
  43.     fprintf(stderr, "can not control exposuren");
  44.     return;
  45.   }
  46.   m_min_exposure = info.min;
  47.   m_max_exposure = info.max;
  48.   if (m_min_exposure >= m_max_exposure) {
  49.     fprintf(stderr, "no or wrong exposure range");
  50.     return;
  51.   }
  52.   m_can_control_exposure = true;
  53.   // query for manual gain availability
  54.   info.feature_id = FEATURE_GAIN;
  55.   dc1394_get_camera_feature(m_handle, m_node, &info);
  56.   if (info.manual_capable != DC1394_TRUE) {
  57.     fprintf(stderr, "can not control gainn");
  58.     return;
  59.   }
  60.   m_min_gain = info.min;
  61.   m_max_gain = info.max;
  62.   if (m_min_gain >= m_max_gain) {
  63.     fprintf(stderr, "no or wrong exposure range");
  64.     return;
  65.   }
  66.   m_can_control_gain = true;
  67. }
  68. // [0..1]
  69. double LinuxDC1394CameraController::GetCurrentExposure()   
  70. {
  71.   unsigned int curr_exposure = 0;
  72.   int success = dc1394_get_exposure(m_handle, m_node, &curr_exposure);
  73.   if (success!=DC1394_SUCCESS) {
  74.     fprintf(stderr, "get_exposure returned %dn", success);
  75.     return -1;
  76.   }
  77.   m_last_exposure = curr_exposure;
  78.   return (curr_exposure-m_min_exposure) / 
  79.     (m_max_exposure-m_min_exposure);
  80. }
  81. // true if change has an effect, false if step is too small
  82. // [0..1]
  83. bool LinuxDC1394CameraController::SetExposure(double exposure)  
  84. {
  85.   printf("exposure %fn", exposure);
  86.   unsigned int new_exposure = (unsigned int)
  87.     exposure*(m_max_exposure-m_min_exposure)-m_min_exposure;
  88.   if (new_exposure==m_last_exposure) {
  89.     return false;
  90.   }
  91.   int success = 
  92.     dc1394_set_exposure(m_handle, m_node, new_exposure);
  93.   if (success!=DC1394_SUCCESS) {
  94.     fprintf(stderr, "set_exposure returned %dn", success);
  95.     return false;
  96.   }
  97.   m_last_exposure = new_exposure;
  98.   unsigned int new_gain = 
  99.     (unsigned int) exposure*(m_max_gain-m_min_gain)-m_min_gain;
  100.   success = 
  101.     dc1394_set_gain(m_handle, m_node, new_gain);
  102.   if (success!=DC1394_SUCCESS) {
  103.     fprintf(stderr, "set_gain returned %dn", success);
  104.     return false;
  105.   }
  106.   return true;
  107. }
  108. bool LinuxDC1394CameraController::SetCameraAutoExposure(bool enable)
  109. {
  110.   if (enable) {
  111.     // disable software control, enable camera auto control
  112.     // test if camera auto exposure control is on
  113.     dc1394bool_t is_on = DC1394_FALSE;
  114.     int success = 
  115.       dc1394_is_feature_auto(m_handle, m_node,
  116.      FEATURE_EXPOSURE, &is_on);
  117.     if (success!=DC1394_SUCCESS) {
  118.       fprintf(stderr, "error querying auto exposuren");
  119.       return false;
  120.     }
  121.     if (is_on==DC1394_FALSE) {
  122.       // printf("auto exposure control is not activen");
  123.       success = 
  124. dc1394_auto_on_off(m_handle, m_node, 
  125.    FEATURE_EXPOSURE, DC1394_TRUE);
  126.       if (success!=DC1394_SUCCESS) {
  127. fprintf(stderr, "can not turn on camera auto exposuren");
  128. return false;
  129.       }
  130.     }
  131.     if (m_can_control_gain) {
  132.       // turn on auto-gain, too
  133.       // test if camera auto gain control is on
  134.       is_on = DC1394_FALSE;
  135.       success = 
  136. dc1394_is_feature_auto(m_handle, m_node,
  137.        FEATURE_GAIN, &is_on);
  138.       if (success!=DC1394_SUCCESS) {
  139. fprintf(stderr, "error querying auto gainn");
  140. return false;
  141.       }
  142.       if (is_on==DC1394_FALSE) {
  143. success = 
  144.   dc1394_auto_on_off(m_handle, m_node, 
  145.      FEATURE_GAIN, DC1394_TRUE);
  146. if (success!=DC1394_SUCCESS) {
  147.   fprintf(stderr, "can not turn on camera auto gainn");
  148.   // ignore this
  149.   // return false;
  150. }
  151.       }
  152.     }
  153.   } else {
  154.     // test if camera auto exposure control is on
  155.     dc1394bool_t is_on = DC1394_TRUE;
  156.     int success = 
  157.       dc1394_is_feature_auto(m_handle, m_node,
  158.      FEATURE_EXPOSURE, &is_on);
  159.     if (success!=DC1394_SUCCESS) {
  160.       fprintf(stderr, "error querying auto exposuren");
  161.       return false;
  162.     }
  163.     if (is_on==DC1394_TRUE) {
  164.       // printf("auto exposure control is activen");
  165.       success = 
  166. dc1394_auto_on_off(m_handle, m_node, 
  167.    FEATURE_EXPOSURE, DC1394_FALSE);
  168.       if (success!=DC1394_SUCCESS) {
  169. fprintf(stderr, "can not turn off camera auto exposuren");
  170. return false;
  171.       }
  172.     }
  173.    
  174.     // set m_last_exposure
  175.     double val = GetCurrentExposure();
  176.     if (val==-1) {
  177.       return false;
  178.     }
  179.   }
  180.   
  181.   return true;
  182. }
  183. bool LinuxDC1394CameraController::CanAdjustExposure()
  184. {
  185.   return m_can_control_exposure;
  186. }
  187. #endif