SDK di Android: get un'image della camera in anteprima raw senza visualizzarla

Voglio eseguire l'elaborazione delle immagini con un'image cruda senza mostrarla sullo schermo, cosa che ovviamente riduce le performance.

Secondo le risposte a questo thread L' utilizzo di foto da una camera senza anteprima non era ansible in Android 1.5, ma qualcuno sa se è ansible in Android 4 (livello API 15)?

  • Come caricare lo schermo istantaneo dello splash come nelle applicazioni Android di Google?
  • Salvare la pagina in cache usando il webview in android
  • Mettere le densità dello schermo nella benna corretta
  • ClassCastException quando si lega al servizio locale da un'altra attività
  • Perché il decoder di MediaCodec non produce un formato YUV unificato (come YUV420P)?
  • Avere messaggio di errore (scusa questo video non può essere riprodotto) per riprodurre video in linea in VideoView
  • 3 Solutions collect form web for “SDK di Android: get un'image della camera in anteprima raw senza visualizzarla”

    In Android 4, l'opzione più semplice per ricevere i dati dell'image grezze senza visualizzarla sullo schermo consiste nell'utilizzare la chiamata Camera.setPreviewTexture () per indirizzare i frame di anteprima alla GPU.

    Puoi utilizzare questo in due modi:

    1. Effettuare l'elaborazione effettiva sulla GPU: impostare un context OpenGL ( OpenGL ES 2 tutorial ) e creare un object SurfaceTexture in quel context. Passare quindi l'object a setPreviewTexture e avviare l'anteprima. Quindi, nel codice OpenGL, puoi call SurfaceTexture.updateTexImage e l'ID texture associato con SurfaceTexture verrà aggiornato all'ultima cornice di anteprima dalla camera. È anche ansible leggere i dati della struttura RGB alla CPU per ulteriori elaborazioni usando glReadPixels, se lo si desidera.
    2. Fai la tua elaborazione sulla CPU: puoi creare semplicemente un object fittizio SurfaceTexture senza creare alcun context OpenGL. Passare qualsiasi integer che si desidera come ID di struttura e colbind SurfaceTexture alla camera utilizzando setPreviewTexture. Finché non si chiama updateTexImage, SurfaceTexture scarterà semplicemente tutti i dati trasmessi dalla camera. Quindi impostare le richieste di anteprima utilizzando setPreviewCallback e utilizzare tali dati (in genere in un formato YUV) per l'elaborazione della CPU. Questo è probabilmente less efficiente di # 1, ma non richiede l'idea di OpenGL.

    Dal momento che non mi è consentito commentare. Per quanto riguarda la risposta di Eddy. Devi lavorare con questo nel NDK, poiché l'utilizzo dell'interface Java nega qualsiasi prestazione. Dover lavorare con un PixelBuffer è assolutamente folle da un punto di vista delle performance. La conversione da RGBA888 a YUV deve essere eseguita anche in C.

    Non provare a utilizzare un TextureView come sarà ancora peggio. Dovresti copiare i Pixel in un Bitmap, quindi da una Bitmap in un arrays prima della conversione in YUV. Questo, in sé, richiede quasi il 30% dell'utilizzo della CPU in un marchio che sfreccia il nuovo Nexus 7 2013.

    Il modo più efficiente è parlare direttamente con Camera.h e ignorare tutte le API Android. È ansible creare il proprio buffer e intercettare i dati YUV prima che vada altrove.

    La visualizzazione dell'anteprima sullo schermo non ha conseguenze sulle performance. Su tutti i dispositivi che ho conosciuto, l'output della camera è "cablata" su una superficie o plot senza CPU, tutte le conversioni a colors e la scalatura curate da hardware dedicato.

    Ci possono essere altri motivi per "hide" l'anteprima, ma tenere presente che l'objective dell'API era inizialmente quello di assicurarsi che l'utente finale vedesse tutto ciò che arriva dalla camera all'applicazione, per ragioni di privacy e di sicurezza.

    L'Android è un fan Android di Google, tutto su telefoni Android, Android Wear, Android Dev e applicazioni Android Games e così via.