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:
- Detectar los límites de un documento en una imagen usando opencv java
- Android cómo hacer la diapositiva de pantalla de imagen?
- Cómo componer (combinar) dos imagen de la foto en android?
- Cómo cambiar el tamaño de una imagen a la imagen de alta resolución sin perder píxeles?
- Android ImageView Vecino más cercano
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
- Umbral en Android con opencv
- ¿Hay un puerto de ImageMagick disponible para Android?
- Dilatación y erosión en Android
- Utilizando el array de bytes de la cámara en bruto para la realidad aumentada
- ¿Cómo manejar la limitación de memoria de la GPU para el procesamiento de imágenes de alta resolución en la GPU?
- Animar la imagen de la cara - usando deformación?
- ¿Cuál es la mejor manera de enviar una imagen desde un dispositivo Android a un servidor para su procesamiento y enviar los resultados?
- El tamaño de la imagen devuelta por Aviary es menor que el original
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);
- {"Error": {"message": "(# 324) Requiere archivo de carga", "type": "OAuthException", "code": 324}}
- Cómo modificar el estilo de Android "fuerza cerrar" ventana?