这段代码曾经工作,但在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");
}
bool每次返回false。用户#0的文件路径/名称是应有的("storage/emululated/0/Pictures/barry.png"),目录Pictures在那里。
什么可以使imwrite返回false?
我可以将垫子转换为bmp并保存它自己(我在非opencv应用程序的其他地方做),但自Highgui。imwrite就在那里,当我编写2.4.0并在Android 3上进行测试时,这段代码曾经有效。如果可以的话,我想使用它。
多谢
巴兹
我简直不敢相信。[facepalm指].
将此添加到您的manifest文件中。
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
谁来扇我一巴掌好吗?我设法从清单中删除了写入权限,所以它不会写入也就不足为奇了……
的Doh .
巴里实际上有两个可能的问题:
-
Android权限。要解决此问题,请将权限添加到清单
"android.permission.WRITE_EXTERNAL_STORAGE" -
您正在尝试将文件保存到SD卡,并且您的设备已连接到"磁盘驱动器"中的PC模式。这意味着您与PC共享访问权限。以"仅充电"模式连接设备。要检查连接模式,使用
Environment.getExternalStorageState()
,对于"Disk mode"将返回shared,对于"Charge only"将返回mounted。我修改了你的代码,现在它看起来像
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"); }
注意版本+4.4 (KitKat),因为android.permission.WRITE_EXTERNAL_STORAGE
不允许在外置SD卡上写入:
WRITE_EXTERNAL_STORAGE权限必须只授予写权限设备上的主要外部存储器。绝不允许应用程序这样做写入辅助外部存储设备,但在其合成权限允许的特定于包的目录。以这种方式限制写操作可以确保系统能够清理文件当应用程序卸载时。
看一下:写入SD卡总是失败
From 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