这段代码以前工作但是在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上进行测试,如果可以,我想使用它。
非常感谢
巴兹
答案 0 :(得分:17)
我无法相信。 [捂脸]。
将此添加到您的清单文件Barry:
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
有人会来打我吗?我设法从清单中删除了写入权限,所以真的没有任何意外,它不会写...
卫生署。
百里
答案 1 :(得分:5)
实际上有两个可能的问题:
Android权限。要修复此问题,请向清单添加权限
“android.permission.WRITE_EXTERNAL_STORAGE”
您正在尝试将文件保存到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权限只能授予对其的写访问权限 设备上的主要外部存储。不得允许应用 写入辅助外部存储设备,除了它们 特定于程序包的目录,由合成权限允许。 以这种方式限制写入可确保系统可以清理文件 何时卸载应用程序。
答案 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