Android: OpenCV: imwrite devuelve siempre false y falla al escribir

Este código funcionaba pero en Android 4.2 y OpenCV 2.4.4 falla, pero no sé por qué. ¿Puede alguien arrojar alguna luz sobre él para mí?

Gracias por cualquier ayuda.

Baz

public void SaveImage (Mat mat) { Mat mIntermediateMat = new Mat(); Imgproc.cvtColor(mRgba, mIntermediateMat, Imgproc.COLOR_RGBA2BGR, 3); File path = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES); String filename = "barry.png"; File file = new File(path, filename); Boolean bool = null; filename = file.toString(); bool = Highgui.imwrite(filename, mIntermediateMat); if (bool == true) Log.d(TAG, "SUCCESS writing image to external storage"); else Log.d(TAG, "Fail writing image to external storage"); } 

Bool vuelve falso cada vez. La ruta / nombre del archivo es como debe ser ("storage / emulated / 0 / Pictures / barry.png") para el usuario # 0 y el directorio Pictures está allí.

¿Qué puede hacer que imwrite devuelva false?

Podría convertir la estera a un bmp y guardarlo yo mismo (lo que hago en otra parte en una aplicación no OpenCV), pero ya que Highgui.imwrite está ahí, y este código solía funcionar cuando estaba escribiendo a 2.4.0 y probando en Android 3.x, me gustaría usarlo si puedo.

Muchas gracias

Baz

No lo puedo creer. [Facepalm].

Añadir esto a su archivo de manifiesto Barry:

 <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/> 

¿Vendría alguien y me daría una bofetada por favor? Me las arreglé para eliminar el permiso de escritura del manifiesto así que realmente no debería haber ninguna sorpresa que no escribiría …

Doh.

Barry

En realidad hay dos posibles problemas:

  1. Permisos de Android. Para solucionar este problema, añada el permiso al manifiesto

    "Android.permission.WRITE_EXTERNAL_STORAGE"

  2. Está intentando guardar el archivo en la tarjeta SD y su dispositivo está conectado a la PC en el modo "Unidad de disco". Significa que comparte los derechos de acceso con la PC. Conecte su dispositivo en el modo "Carga solamente". Para comprobar el modo de conexión utilice

    Environment.getExternalStorageState() , se devolverá compartido para "Disk mode" y se montará en "Charge only".

    He modificado tu código y ahora parece

     public void SaveImage (Mat mat) { Mat mIntermediateMat = new Mat(); Imgproc.cvtColor(mRgba, mIntermediateMat, Imgproc.COLOR_RGBA2BGR, 3); File path = new File(Environment.getExternalStorageDirectory() + "/Images/"); path.mkdirs(); File file = new File(path, "image.png"); filename = file.toString(); Boolean bool = Highgui.imwrite(filename, mIntermediateMat); if (bool) Log.i(TAG, "SUCCESS writing image to external storage"); else Log.i(TAG, "Fail writing image to external storage"); } 

Tenga cuidado con las versiones +4.4 (KitKat) porque android.permission.WRITE_EXTERNAL_STORAGE no permite escribir en la tarjeta SD externa:

El permiso WRITE_EXTERNAL_STORAGE sólo debe conceder acceso de escritura al almacenamiento externo primario en un dispositivo. No se debe permitir que las aplicaciones escriban en dispositivos de almacenamiento externos secundarios, excepto en sus directorios específicos de paquetes según lo permitan los permisos sintetizados. Restringir escrituras de esta manera asegura que el sistema puede limpiar archivos cuando las aplicaciones se desinstalan.

Eche un vistazo a: Escritura en tarjeta SD siempre fallando

  • Android Studio, Gradle, OpenCV y NDK
  • Android OpenCV Buscar contornos
  • Parece que su dispositivo no es compatible con la cámara (o está bloqueado)
  • OpenCV4android detecta forma y color (HSV)
  • No se puede construir caffe en android
  • ¿Cómo realizar el recorte automático para el documento Reconocer la imagen con la cámara?
  • Cómo averiguar la cara detectada es real o falsa
  • Cómo integrar OpenCV en el proyecto Qt Creator Android
  • configuración de vídeo opencv a pantalla completa android
  • Compilación de la biblioteca de Android-OpenCV con Cygwin
  • Visualización de imágenes y conversión a escala de grises - OpenCV para Android, API de Java
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.