lunes, 30 de mayo de 2011

Tiempos - Usando la PixelFly programáticamente

Similar al caso de la Pulnix, se escribe código usando la API provista para PixelFly y se miden los tiempos aproximados. En este caso se cuenta con dos APIs a utilizar: la original de la cámara (para VC++) y un SDK unificado para las PixelFly y las Sensicam llamado Uniform SDK. Se opta por el último por tener una interfaz más clara y no requerir elementos de WinApi para funcionar; según la documentación esta interfaz es más lenta que la original, pero igualmente sirve para computar órdenes de magnitud.

Resultados:
  • Snapshots tomados: 200
  • fps entre Snapshots: 50
  • Tiempo Total: 4000ms
  • Tiempo Promedio: 20 ms (es decir, 50 fps)
Misma conclusión que la obtenida con la Pulnix: transferencia despreciable. Igualmente seguimos teniendo el doble del tiempo previsto para la toma de fotos.
Afortunadamente, la PixelFly presenta una opción de binning que puede reducir los tiempos empleados. El binning consiste en realizar algún procesamiento sobre un conjunto de píxeles y generar un único píxel que contiene información de los anteriores. En el común de los casos la operación consiste en promediar los valores.
Los nuevos resultados:

  • Snapshots tomados: 200
  • fps entre Snapshots: ?
  • Tiempo Total: 2000ms
  • Tiempo Promedio: 10 ms (es decir, 100 fps)
 Conclusión: ya tenemos el tiempo que queríamos !!
Al parecer el binning permite incluso que la cámara tome fotografías en una frecuencia más alta. Queda pendiente evaluar la capacidad de double shutter.
    Aquí el código:


       1:  #define GAIN 1
       2:  #define DELAY 0 //ms
       3:  #define EXPOSURE_TIME 5 //ms
       4:  #define ROIX 2 //from 1 to 20
       5:  #define ROIY 2 //from 1 to 20
       6:   
       7:  int main(int argc, char* argv[]) {
       8:      int totalSnapshots;
       9:      std::cout << "Qty of snapshots to take: ";
      10:      std::cin >> totalSnapshots;
      11:      
      12:      int camId;
      13:      CAMINFO camData[8];
      14:   
      15:      int boardNumber = 0;
      16:      int error;
      17:      if (error = SELECT_CAMERA("pixelfly", boardNumber, &camId, camData))
      18:          showErrorAndClose(error);
      19:      else {
      20:          if (error = SETUP_CAMERA(camId, camData, 0, 0, 0, 1, ROIX, 1, ROIY, 1, 1, GAIN, DELAY, EXPOSURE_TIME))
      21:              showErrorAndClose(error);
      22:          else {    
      23:              time_t beginTime, endTime;
      24:              time(&beginTime);
      25:      
      26:              int snapshotNumber = 0;
      27:              while (! error && snapshotNumber < totalSnapshots) {
      28:                  if (error = SNAP(camId, camData, 0))
      29:                      showErrorAndClose(error);
      30:                  else {
      31:                      if (error = GETIMAGE(camId, camData, 2000))
      32:                          showErrorAndClose(error);
      33:                      else 
      34:                          // image in memory at this point
      35:                  }
      36:                  snapshotNumber++;
      37:              }
      38:              time(&endTime);
      39:              std::cout << std::endl << "Tiempo Promedio por imagen: " << 1000.0 * (double)difftime(endTime, beginTime) / (float)totalSnapshots << "ms." << std::endl;
      40:          }
      41:          CLOSE_CAMERA(camId, camData);
      42:      }
      43:      return 0;
      44:  }