Red de conocimiento informático - Problemas con los teléfonos móviles - La cámara UVC es fácil de usar y graba

La cámara UVC es fácil de usar y graba

Este programa se modifica en función de UVCCamera.

Varios problemas clave encontrados durante el uso:

1. Formato YUV: NV21 y otros formatos.

2. El problema de eficiencia de la conversión de YUV a RGB.

3. Pérdida de memoria de mapa de bits.

4. Pérdidas de memoria del controlador

En primer lugar, onFrame (esta es la función callBack de la cámara para obtener datos, los datos del byte [] son ​​los datos de la cámara) no puede funcionar operaciones que requieren mucho tiempo (como operaciones de datos como la transposición de mapas de bits); de lo contrario, se bloquearán (antes de colocar esta operación aquí) y luego transferirán directamente el mapa de bits), lo que provocará un retraso.

Después de transmitir los datos del byte [], el byte [] debe convertirse en un mapa de bits.

Durante la conversión de byte[] a mapa de bits, se crean demasiados mapas de bits, lo que provoca pérdidas de memoria y fallos del programa.

Por lo tanto, 1. Establezca Bitmap como una variable estática para evitar el problema de la creación repetida. 2. Modifique la función de byte [] a mapa de bits. La función original devuelve mapa de bits. Ahora, el mapa de bits se pasa como parámetro a la función y los datos del mapa de bits se transfieren directamente. Pasos de retorno reducidos.

Esto era así antes:

Esto es lo que parece ahora:

Este último muestra el mapa de bits en ImageView a través de handleImage.

NV21 tiene problemas de mapa de bits.

Mi programa se modifica básicamente en función de UVCCamera. UVCCamera no toma cada cuadro, pero deja una interfaz que configuro los datos de cada cuadro en formato NV21.

El formato de datos en onFrame es NV21 (NV21 es un tipo de YUV y YUV tiene muchos formatos), por lo que al convertir a un mapa de bits, es necesario convertirlo de acuerdo con la fórmula. Lo convertí usando RenderScript que viene con el sistema y descubrí que la imagen era clara, pero los colores eran incorrectos.

Buscando la función de mapa de transposición yuv, encontré esto. La imagen aún se transfirió, era muy obvia, la imagen era muy clara, pero el color era incorrecto.

Entonces la función fue modificada. El efecto modificado es el siguiente.

Debido a los conceptos vagos de YUV y RGB, la función de mapa de transposición YUV buscada es, aunque de hecho es un mapa de transposición NV21, hay una diferencia de color después de la conversión. Después de modificar el orden de asignación de rgba [], el color es normal. De hecho, este es el proceso de conversión de codificación YUV a codificación RGB. Los problemas de transmisión de datos provocan anomalías en el color. Esta situación requiere un análisis paso a paso de los problemas en la conversión de datos de YUV a RGB. Antes de que se almacene como ABGR, después de que se almacene como ARGB.

Para un análisis detallado, consulte este artículo:

Registro de aprendizaje simple de RGB y YUV

Sin embargo, cuando realmente se utiliza el método anterior, es descubrió que la eficiencia es demasiado baja. Por lo tanto, necesitamos utilizar el método so para realizar la conversión.

Enlaces de referencia específicos:

pruebas libyuv-libyuv utilizando las interfaces ARGBToI420 y ConvertToARGB

FOURCC_ IYUV a FOURCC_NV21 en la función _example_libyuv_Test_convertToArgb.

Manejar las pérdidas de memoria.

Como quería ser vago, no usé antes los consejos de Android Studio para lidiar con pérdidas de memoria. Luego dejé el programa ejecutándose por un día y falló.

La forma anterior de escribir era la siguiente, Android Studio te dirá que esto es riesgoso.

Ahora cámbielo a lo siguiente

De hecho, también puede llamar a handler.removeCallbacksAndMessages(null) en la destrucción de la actividad para evitar pérdidas de memoria del código fuente de Android. El sistema es básicamente Todos están usando este método.

Posdata: este artículo comenzó en 2018. En ese momento, se usaba una cámara USB binocular. He estado arreglando las cosas recientemente, así que la he mejorado un poco.

Enlace de referencia:

Conversión de imágenes por transposición yuv de Android

Detalles gráficos del formato de datos YUV420

Análisis del formato YUV en Android

Mapa de bits transpuesto Nv21 (conversión eficiente)

Mapa de bits de Android

Android resuelve la confusión de por qué Handler debe ser estático