Android SDK: Obtener una imagen de la vista previa de la cámara sin mostrarla

Quiero hacer el procesamiento de imágenes con una imagen en bruto sin mostrarlo en la pantalla, lo que obviamente reduce el rendimiento.

De acuerdo con las respuestas a este hilo Tomando fotos de la cámara sin vista previa no fue posible en Android 1.5, pero ¿alguien sabe si es posible en Android 4 (API nivel 15)?

En Android 4, la opción más simple para recibir datos de imágenes sin mostrarlo en pantalla es utilizar la llamada Camera.setPreviewTexture () para encaminar los marcos de vista previa a la GPU.

Puede utilizar esto de dos maneras:

  1. Realice el procesamiento real en la GPU: configure un contexto OpenGL ( tutorial de OpenGL ES 2 ) y cree un objeto SurfaceTexture en ese contexto. A continuación, pase ese objeto a setPreviewTexture e inicie la vista previa. Entonces, en su código OpenGL, puede llamar SurfaceTexture.updateTexImage y el ID de textura asociado con SurfaceTexture se actualizará al último marco de vista previa de la cámara. También puede volver a leer los datos de textura RGB en la CPU para su posterior procesamiento mediante glReadPixels, si lo desea.
  2. Haga su procesamiento en la CPU: Simplemente puede crear un objeto SurfaceTexture ficticio sin ningún contexto OpenGL configurado. Pase cualquier número entero que desee como ID de textura y conecte SurfaceTexture a la cámara usando setPreviewTexture. Siempre y cuando no llame a updateTexImage, SurfaceTexture simplemente descartará todos los datos transmitidos por la cámara. A continuación, configure las devoluciones de llamada de vista previa utilizando setPreviewCallback y utilice esos datos (normalmente en un formato YUV) para procesar la CPU. Esto es probablemente menos eficiente que # 1, pero no requiere saber OpenGL.

Ya que no se me permite hacer comentarios. Respecto a la respuesta de Eddy. Necesita trabajar con esto en el NDK, ya que usar la interfaz Java negará cualquier beneficio de rendimiento. Tener que trabajar con un PixelBuffer es absolutamente insano desde el punto de vista del rendimiento. Su conversión de RGBA888 a YUV también se debe hacer en C.

No intente usar un TextureView como lo será aún peor. Usted tendría que copiar los pixeles en un mapa de bits entonces de un mapa de bits en un arsenal todo antes de la conversión a YUV. Esto, por sí mismo, toma casi el 30% de la utilización de la CPU en un nuevo Nexus 7 2013.

La forma más eficiente es hablar directamente con Camera.h y omitir todas las API de Android. Puede crear su propio buffer e interceptar los datos YUV antes de que vaya a cualquier otro lugar.

Mostrar la vista previa en la pantalla no tiene consecuencias de rendimiento. En todos los dispositivos que conozco, la salida de la cámara está "conectada" a una superficie o textura sin ninguna CPU, toda la conversión y escalado de color realizada por hardware dedicado.

Puede haber otras razones para "ocultar" la vista previa, pero tenga en cuenta que el propósito de la API inicialmente era asegurarse de que el usuario final vea lo que llega de la cámara a la aplicación, por razones de privacidad y seguridad.

FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.