2013-04-25 10 views
6

La mia app fotocamera elabora i fotogrammi della fotocamera da onPreviewFrame() con OpenCV e li visualizza sullo schermo. Tuttavia, i frame grezzi sono orientati nel modo in cui la videocamera è montata sul telefono, che di solito non è rivolta verso l'alto. Per risolvere questo problema, li ruoto manualmente con OpenCV, che richiede molto tempo.Orientare correttamente i dati della fotocamera non elaborati

Ho guardato in utilizzando setDisplayOrientation, ma la documentazione afferma che

Ciò non pregiudica l'ordine dei byte passato in onPreviewFrame

e ho bisogno dei dati di realtà essere con il lato destro rivolto verso l'alto, non solo il display rivolto verso l'alto. Come posso orientare correttamente i dati della fotocamera grezza? Se ciò è impossibile, posso ruotare in modo efficiente l'array di byte passato a me in onPreviewFrame(), ad esempio utilizzando OpenGL?

risposta

3

No, non c'è modo di ottenere l'API per farlo, ma per capire come è necessario ruotare i dati, prendere un'occhiata al codice di esempio Camera.Parameters.setRotation. Mentre setRotation() interessa solo i file JPEG, si desidera applicare la stessa quantità di rotazione ai dati che si ottengono suPreviewFrame() come per i file JPEG.

Riprodurre il codice di esempio qui, con lievi modifiche:

public void onOrientationChanged(int orientation) { 
    if (orientation == ORIENTATION_UNKNOWN) return; 
    android.hardware.Camera.CameraInfo info = 
     new android.hardware.Camera.CameraInfo(); 
    android.hardware.Camera.getCameraInfo(cameraId, info); 
    orientation = (orientation + 45)/90 * 90; 
    int rotation = 0; 
    if (info.facing == CameraInfo.CAMERA_FACING_FRONT) { 
     rotation = (info.orientation - orientation + 360) % 360; 
    } else { // back-facing camera 
     rotation = (info.orientation + orientation) % 360; 
    } 
    mCameraOrientation = rotation; // Store rotation for later use 
} 

... 

void onPreviewFrame(byte[] data, Camera camera) { 
    switch(mCameraOrientation) { 
     case 0: 
      // data is correctly rotated 
      break; 
     case 90: 
      // rotate data by 90 degrees clockwise 
     case 180: 
      // rotate data upside down 
     case 270: 
      // rotate data by 90 degrees counterclockwise 
    } 
} 

quindi è necessario ereditare da OrientationEventListener e sovrascrivere onOrientationChanged come sopra, e quindi utilizzare il valore orientamento calcolata da lì per ruotare i fotogrammi di anteprima quando entrare.

1

setDisplayOrientation ruota solo la fotocamera rispetto alla superficie su cui si sta disegnando, se ricordo correttamente. Credo che desideri ruotare l'interpretazione della fotocamera, cosa potresti ottenere con setRotation

+1

Ho visto prima, ma dice 'Ciò influenza le immagini restituite da JPEG Camera.PictureCallback. Ruota i dati grezzi anche se non si utilizza questa richiamata? –

+0

i dati grezzi non possono essere manipolati, poiché è proprio ciò che il sensore "vede". Credo che scriva solo il tag Exif corrispondente nel JPEG. Ma openCV dovrebbe essere in grado di leggere Exif, quindi cambia le coordinate quando lo copia nel Mat. Credo. – sschrass

+0

Quando utilizzo 'onPreviewFrame()', rilascia i dati YUV non elaborati in un array di byte. Non è in corso alcuna conversione in JPEG e in realtà non "scatto". Quindi non sembra che questa soluzione funzionerà per me. –

Problemi correlati