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

时间:2013-03-08 10:12:33

标签: 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");
  }
每次布尔都会回来假。用户#0的文件路径/名称应该是(“storage / emulated / 0 / Pictures / barry.png”),而目录图片就在那里。

什么可以使imwrite返回false?

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

非常感谢

巴兹

4 个答案:

答案 0 :(得分:17)

我无法相信。 [捂脸]。

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

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

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

卫生署。

百里

答案 1 :(得分: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");
    }
    

答案 2 :(得分:0)

请注意版本+4.4(KitKat),因为android.permission.WRITE_EXTERNAL_STORAGE不允许在外部SD卡上写入:

  

WRITE_EXTERNAL_STORAGE权限只能授予对其的写访问权限   设备上的主要外部存储。不得允许应用   写入辅助外部存储设备,除了它们   特定于程序包的目录,由合成权限允许。   以这种方式限制写入可确保系统可以清理文件   何时卸载应用程序。

请查看:Writing to SD Card always failing

答案 3 :(得分:0)

来自Android 6 +

  

从Android 6.0(API级别23)开始,用户在应用运行时向应用授予权限,而不是在他们安装应用时... ...

你需要添加以下内容:

  if (ContextCompat.checkSelfPermission(this, Manifest.permission.WRITE_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) 
  {
        ActivityCompat.requestPermissions(
                this,
                new String[] { Manifest.permission.WRITE_EXTERNAL_STORAGE },
                PERMISSION_REQUEST_WRITE_EXTERNAL_STORAGE);
  }

https://developer.android.com/training/permissions/requesting.html