Android: Acceso a los datos del marco de vista previa de cámara de hardware sin dibujarlos

De acuerdo con los documentos de cámara de Android desde el lado del SDK de Java, los fotogramas de previsualización de la cámara tienen que suministrarse una superficie (visible y activa) a la que se puede acceder para acceder a los datos del marco. He vinculado algunas de las cosas que he encontrado aquí (soy nuevo tan tapado en 2 hipervínculos), pero he ido a toneladas de documentación de varias cosas antes de liquidación de publicar mi propia pregunta aquí en SO.

Mis problemas:

A) Yo explícitamente no quiero dibujar la vista previa de la cámara a la pantalla, sólo quiero los datos de bytes (que puedo obtener de aquí) directamente desde el búfer de la cámara si es posible.

B) Sí, vi esto: Tomando la foto de la cámara sin vista previa .

Sin embargo, esto dicta que las aplicaciones que usan esta biblioteca tienen que insertar esta vista (aparentemente) arbitraria en su diseño de aplicación, que tiene que estar visible todo el tiempo (no pueden cambiar diseños, cambiar la visibilidad de los contenedores primarios o usar una subactividad) durante El ciclo de vida de la aplicación.

De hecho, mis necesidades son similares a las de este póster , excepto que quiero stream en tiempo real continua de los datos de previsualización de la cámara, no una captura guardada en la imagen en disco. Por lo tanto PictureCallback funciona para él junto con la llamada myCamera.takePicture . Por razones obvias, escribir capturas continuas en disco no es una solución para mí, por lo que no funcionará en mi caso. myCamera.takePicture también es mucho más lento que obtener los fotogramas de vista previa.

C) He empezado a jugar con el NDK, y he tenido una sensación bastante buena para ello. Sin embargo, de acuerdo a este acceso a los datos de la cámara a través de nativo no es compatible o recomendado, y una gran molestia para la compatibilidad de dispositivos, incluso entonces.

Si esto es anticuado, y hay sólidas rutas NDK a la adquisición de datos de cámara de dispositivos Android, no pude encontrarlos, así que si pudiera señalar a mí que sería genial.

D) Quiero hacer que esta biblioteca sea accesible desde herramientas como Unity (en forma de un plugin de unidad), para lo cual quiero poder simplemente compilarlo en un JAR (o .so para nativo) y esperar que funcione Aplicaciones Android que importan la biblioteca de esa manera para que puedan utilizar la cámara sin configuraciones específicas de interfaz de usuario / configuración necesarias del desarrollador de la aplicación.

Contexto:

Quiero ser capaz de crear una biblioteca de procesamiento de la visión para su uso en aplicaciones Android, y no quiero limitar las aplicaciones que utilizan la biblioteca para tener que utilizar diseños de aplicaciones específicas y dibujar vistas específicas a la pantalla con el fin de utilizar la visión Procesamiento de resultados – para un ejemplo muy simple, si una aplicación quiere utilizar mi biblioteca para obtener el color promedio de lo que la cámara ve, y quiere teñir una imagen en la pantalla de ese color.

Cualquier sugerencia que pueda obtener para cualquiera de los puntos que tengo será super-útil. ¡Muchas gracias por su tiempo!

Olvidé completamente que tenía esta pregunta. 2 años y un par de Android SDK versiones posteriores, tenemos un sistema de trabajo.

Estamos usando un SurfaceTexture extendido, cameraSurface con una referencia a la cámara requerida. Usando la SurfaceTexture de la superficie de la SurfaceTexture , llamamos

 mCamera.setPreviewTexture(mSurfaceTexture); mCamera.startPreview(); 

A continuación, anule la vista previewCallback la cámara activa actual de su actividad o donde lo necesite.

 mCamera.setPreviewCallback(new PreviewCallback() { public void onPreviewFrame(final byte[] data, final Camera camera) { // Process the contents of byte for whatever you need } }); 

Esto le permite procesar continuamente lo que la cámara ve, en lugar de simplemente tener que ir a través de imágenes almacenadas. Por supuesto, esto se limitará a la resolución de previsualización de su cámara (que puede ser diferente de la captura o resoluciones de vídeo).

Si consigo el tiempo, trataré de lanzar una demostración de trabajo de barebones.

Editar: El SDK I había vinculado a ya no está libremente disponible. Todavía puede solicitar uno a través de la página de contacto de BitGym .

No se puede obtener el SurfaceView para obtener una vista previa de la imagen. Lo que puedes hacer es delegar la responsabilidad de capturar el byte[] a las aplicaciones que implementan tu biblioteca, lo que les permite usar tu biblioteca no sólo para las imágenes de la cámara, sino también para las imágenes que ya se han tomado.

  • Android, cuadros de vista previa de la cámara
  • Android Camera 2, cómo recortar tamaño de vista previa
  • SurfaceView con vista previa de cámara no se destruye
  • Cómo hacer la aplicación WhiteList en modo Doze Android 6.0
  • Android: cómo mostrar la vista previa de la cámara con devolución de llamada?
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.