Detección de imágenes en paralelo y vista previa de la cámara OpenCV Android
Estoy usando OpenCV para detectar una imagen. Aquí está mi problema: mi función detect_image(mRgba)
necesita algo de tiempo para realizar operaciones y dar algunos resultados. Mientras que la función está computando la previsualización de la cámara es congelada porque muestra solamente la imagen cuando el código alcanza el return inputFrame.rgba()
quisiera saber cómo hacer que la operación paralela, la función estará computando en un fondo mientras que la inspección previo de cámara trabaja con velocidad normal.
public Mat onCameraFrame(CvCameraViewFrame inputFrame) { mRgba = inputFrame.rgba(); detect_image(mRgba); return inputFrame.rgba(); }
- Obtener el color del píxel tocado desde la vista previa de la cámara
- Calcular la relación de aspecto de la imagen de destino Transformar perspectiva
- El parámetro setPictureSize de la cámara Android muestra una imagen con rayas
- Imagen de Android magick
- Android cómo hacer la diapositiva de pantalla de imagen?
- Filtro esférico en android
- Crear múltiples secciones en un marco y hacer que cada sección funcione singleton
- ¿Cómo identificar imágenes similares a pesar de haber sido recortadas?
- OpenCV para Android - NativeCameraView todavía existe?
- Reconocimiento y seguimiento de objetos en movimiento más rápido en Android
- No se puede construir caffe en android
- Cortar la imagen después de seleccionar el área mediante la detección de bordes en android
- Incluir OpenCV en el paquete de aplicaciones de Android
Para obtener sólo un gusto en la paralelización, el enfoque sencillo sería simplemente utilizar un AsyncTask para procesar sus imágenes:
Página de referencia AsyncTask
Una introducción más amigable se puede encontrar aquí:
http://android-developers.blogspot.co.il/2010/07/multithreading-for-performance.html
mientras esto:
http://developer.att.com/developer/forward.jsp?passedItemId=11900176
es una buena introducción a multi-threading en Android.
Si quieres empezar , un algoritmo simple debería funcionar así:
- desde su método "onCameraFrame" compruebe si tiene un AsyncThread para procesar la imagen que ya se está ejecutando
- si la respuesta es "sí", sólo muestro mRgba en la ventana de vista previa y devuelve
- si la respuesta es "no", inicie un nuevo AsyncThread y déjelo ejecutar "detectImage" en mRgba, asegurándose de que los resultados se guardan en el método onPostExecute.
Con este algoritmo, si su sistema puede detectar 4 imágenes por segundo mientras toma una vista previa a 60fps (por ejemplo), usted será capaz de obtener un video suave con un nuevo resultado sobre cada 20-30 marcos en un solo dispositivo de procesador, bajo la suposición real de que detect_image es intensivo en la CPU mientras que la vista previa de la cámara es intensiva de E / S.
Captura: xxxxxxxxxxxxxxxxxxxx ... Procesamiento: 1 ....... 1 ....... 1 ....... 1 ..... 1 ....... 1 .... tiempo ------------------------------------>
Comenzando con HoneyComb, un enfoque más refinado sería dar cuenta del número de núcleos en su CPU (los teléfonos multinúcleo / tabletas se están volviendo cada vez más comunes) e iniciar N AsyncTask en paralelo (uno para cada núcleo), alimentando una imagen de vista previa diferente a cada uno uno (tal vez utilizando un grupo de hilos …).
Si separa cada subproceso por un retardo fijo (sobre la duración de detectImage / N), debería obtener un flujo constante de resultados con una frecuencia que debería ser un múltiplo de la versión de subproceso único.
Captura: xxxxxxxxxxxxxxxxxxxx ... Procesamiento: 1.2.3.4.1.2.3.4.1.2.3.4.1.2.3.4.1.2.3.4 .... tiempo ------------------------------------>
Espero que esto ayude