Android:OpenCV:imwrite总是返回false并且无法写入

Bar*_*rry 14 android opencv

这个代码以前工作但是在Android 4.2和OpenCV 2.4.4上它失败了,但我不知道为什么.任何人都可以为我解释它吗?

谢谢你的帮助.

巴兹

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");
  }
Run Code Online (Sandbox Code Playgroud)

bool每次都会回来假.对于用户#0,文件路径/名称应该是("storage/emulated/0/Pictures/barry.png"),并且目录是在那里.

什么可以使imwrite返回false?

我可以将mat转换为bmp并自己保存(我在非OpenCV应用程序中执行其他操作)但是因为Highgui.imwrite在那里,并且这段代码在我写入2.4.0并在Android上测试时曾经工作过3.x,如果可以,我想用它.

非常感谢

巴兹

Bar*_*rry 18

我简直不敢相信.[捂脸].

将此添加到您的清单文件Barry:

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
Run Code Online (Sandbox Code Playgroud)

请问有人来打我吗?我设法从清单中删除了写入权限,所以真的没有任何意外,它不会写...

卫生署.

巴里


小智 5

实际上有两个可能的问题:

  1. Android权限.要解决此问题,请向清单添加权限

    "android.permission.WRITE_EXTERNAL_STORAGE"

  2. 您正尝试将文件保存到SD卡,并且您的设备已在"磁盘驱动器"模式下连接到PC.这意味着您与PC共享访问权限.以"仅充电"模式连接设备.检查连接模式使用

    Environment.getExternalStorageState(),它将返回 "磁盘模式"的共享安装为"仅充电".

    我修改了你的代码,现在它看起来像

    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");
    }
    
    Run Code Online (Sandbox Code Playgroud)