Opencv C + + crear objeto Mat de android NV21 buffer de datos de imagen
He implementado una aplicación de Android que inicia la cámara y enviar todo el búfer de vista previa a los componentes nativos utilizando la interfaz JNI. Dado que los datos de vista previa están en formato de imagen NV21, necesito crear una instancia de cv :: Mat de ella. Lo busqué y encontré la siguiente solución:
cv::Mat _yuv(height, width, CV_8UC1, (uchar *) imagebuffer); where imagebuffer is jbyte*
Sin embargo, no obtenga la imagen esperada en la imagen de salida. Todo está lleno de algunas líneas al azar, etc ¿Alguien sabe exactamente cómo puedo hacerlo?
- No se puede importar las clases import android.hardware.camera2
- Umbral en Android con opencv
- Android y OpenCV: Homography to Camera Pose considerando la cámara intrínseca y la retroproyección
- Eclipse - Método NewStringUTF () no se pudo resolver
- Ejemplo de OpenCV Template Matching en Android
- Android - utiliza la cámara sin vista de superficie o textureview
- Bibliotecas no del sistema en los indicadores de vinculador
- JavaCV + Android Studio + gradle- posible?
- OpenCV: detección de puntos / discos circulares de dominó
- Comparación de imágenes de OpenCV en Android
- OpenCV 2.4.1: UnsatisfiedLinkError
- Reconocimiento y seguimiento de objetos en movimiento más rápido en Android
- Android Studio enlaza las bibliotecas estáticas de OpenCV
Necesita convertir imagen YUV en imagen RGBA.
cv::Mat _yuv(height+height/2, width, CV_8UC1, (uchar *)imagebuffer); cv::cvtColor(_yuv, _yuv, CV_YUV2RGBA_NV21);
Por lo general, las imágenes YUV son imágenes de 1 canal con 1.5*height
(si se tratara de una imagen RGB o en escala de grises).
O puede crear un nuevo Mat y pasar jint matriz a la función nativa y utilizar esa matriz para establecer píxeles de mapa de bits.
jint *_out = env->GetIntArrayElements(out, 0); cv::Mat _yuv(height + height/2, width, CV_8UC1, (uchar*)imagebuffer); cv::Mat _rgba(height, width, CV_8UC4, (uchar *)_out); cv::cvtColor(_yuv, _rgba, CV_YUV2RGBA_NV21); env->ReleaseIntArrayElements(out, _out, 0);
En Java,
bitmap = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888); pixels = new int[width * height]; native_function(height, width, bytedata, pixels); bitmap.setPixels(pixels, 0, width, 0, 0, width, height);
- Retrofit: cómo arreglar "sólo se permite un método http. Encontrado: obtener y obtener "?
- ¿Qué hace realmente AsyncTaskLoader.deliverResult ()?