Android SDK: obtenga la imagen de la cámara de vista previa sin procesar sin mostrarlo

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. Tomar una foto desde la cámara sin vista previa no fue posible en Android 1.5, pero ¿alguien sabe si es posible en Android 4 (API de nivel 15)?

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

Puedes usar esto de dos maneras:

  1. Realice su 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 y comience la vista previa. Luego, en su código OpenGL, puede llamar a 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 utilizando glReadPixels, si lo desea.
  2. Haga su procesamiento en la CPU: simplemente puede crear un objeto SurfaceTexture ficticio sin ningún contexto de OpenGL configurado. Pase cualquier número entero que desee como ID de textura, y conecte SurfaceTexture a la cámara usando setPreviewTexture. Siempre que no llame a updateTexImage, SurfaceTexture simplemente descartará todos los datos que la cámara le pase. Luego configure las devoluciones de vista previa usando setPreviewCallback , y use esa información (generalmente en formato YUV) para el procesamiento de la CPU. Esto es probablemente menos eficiente que el # 1, pero no requiere saber OpenGL.

Como no tengo permitido comentar En cuanto a la respuesta de Eddy. Debe trabajar con esto en el NDK ya que el uso de la interfaz Java anulará cualquier beneficio de rendimiento. Tener que trabajar con un PixelBuffer es una locura desde el punto de vista del rendimiento. Su conversión de RGBA888 a YUV también debe hacerse en C.

No intente usar un TextureView ya que será aún peor. Tendría que copiar los Pixels en un bitmap y luego desde un bitmap en una matriz antes de la conversión a YUV. Esto, por sí solo, lleva casi el 30% de la utilización de la CPU en un nuevo y flamante 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 búfer e interceptar los datos del YUV antes de que vaya a otro lado.

Mostrar vista previa en la pantalla no tiene consecuencias en el rendimiento. En todos los dispositivos que conocí, la salida de la cámara está “conectada” a una superficie o textura sin CPU, toda la conversión de color y escalado está a cargo de hardware dedicado.

Puede haber otras razones para “ocultar” la vista previa, pero tenga en cuenta que el objective de la API era, en primer lugar, asegurarse de que el usuario final vea todo lo que llega de la cámara a la aplicación, por razones de privacidad y seguridad.