Android: procesamiento de imágenes en tiempo real

Tengo una aplicación que toma una vista previa de cámara, realiza una función básica de procesamiento de imagen en cada marco (por ejemplo, detección de borde, cambio de color, deformación de imagen, etc.) y muestra el marco modificado a la pantalla en "tiempo real". Similar a la aplicación "Cámara de papel" en Android Market.

Un resumen de mi enfoque:

1: Crear dos vistas superpuestas en un framelayout:

Un SurfaceView para pasar a Camera.setPreviewDisplay (). (Pasar null impediría la previsualización de la cámara comenzando en algunos dispositivos – opencv utilizado para hacer esto antes de Android 4.0?).

Una clase llamada "LiveView" que extiende View e implementa Camera.PreviewCallBack. Esta vista recibe fotogramas de la cámara y muestra el cuadro después de la modificación (por ejemplo, detección de borde). Esta vista se encuentra en la parte superior de SurfaceView.

2: Llamo Camera.setPreviewCallbackWithBuffer (), de modo que los cuadros se envíen a mi LiveView

3: En el onPreviewFrame () del LiveView, tomo el marco capturado (byte []), convierte de YUV a RGB y realizo funciones de procesamiento de imagen, y llamo a postInvalidate () (La conversión YUV2RGB y procesamiento de imágenes se hacen en código nativo )

4: En el método OnDraw () de LiveView, creo un mapa de bits del marco RGB modificado (byte []), y dibujo el mapa de bits a lienzo.

Esto funciona (entre 5fps y 10fps en varios dispositivos), pero me gustaría escuchar cómo otros han abordado este problema, y ​​cómo se podría mejorar. En particular:

  • ¿Ganaría alguna prestación extendiendo GLSurfaceView en lugar de View para crear la clase LiveView?
  • Suena muy ineficaz tener dos superficies actualizadas para cada fotograma. ¿Hay alguna alternativa?
  • Para hacer esto de manera más eficiente, ¿debo acceder a la cámara a nivel nativo? – Creo que OpenCV adopta este enfoque?

Muchas gracias

También he hecho algo como esto. Lo que hago es ampliar la vista de la cámara. No creo que la vista de cámara se actualiza cada fotograma, pero se recupera. Y sólo la Vista que ha cambiado tendría que ser actualizada. OpenCv hacer un trabajo mejor que la cámara nativa. Después de importar org.opencv.highgui.VideoCapture , puede acceder directamente a la cámara usando:

 VideoCapture camera; camera.retrieve(mGrayMat, Highgui.CV_CAP_ANDROID_GREY_FRAME); 

Para convertir mGrayMat a mRgbaMat: (org.opencv.imgproc.Imgproc)

 Imgproc.cvtColor(mGrayMat, mRgbaMat, Imgproc.COLOR_GRAY2BGRA, 4); 
  • Calcular la relación de aspecto de la imagen de destino Transformar perspectiva
  • Android - Cómo aplicar diffenernt Efectos de imagen en mapa de bits como sepia, blanco y negro, desenfoque, etc
  • Tiempo de procesamiento de OpenCV Mat
  • Cómo encontrar las esquinas de un objeto Rect en openCV?
  • Detección de imágenes en paralelo y vista previa de la cámara OpenCV Android
  • Uso de OpenCV en Java Camera2 API
  • Uso de ImageMagick en mi aplicación Android
  • Reconocimiento de marcadores en Android (reconocimiento de cubos de Rubik)
  • Transmisión de cámara en vivo en Android
  • ¿Es posible cortar un mapa de bits a piezas pequeñas sin cargar toda la cosa en la memoria?
  • Android jpeg pictureCallback en escala de grises Opencv Mat
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.