我正在尝试在我的C ++代码中读取图像
LOGD("Loading image '%s' ...\n", (*inFile).c_str());;
Mat img = imread(*inFile, CV_LOAD_IMAGE_GRAYSCALE);
CV_Assert(img.data != 0);
并获得以下输出:
09-25 17:08:24.798: D/IRISREC(12120): Loading image '/data/data/com.example.irisrec/files/input/osoba1.jpg' ...
09-25 17:08:24.798: E/cv::error()(12120): OpenCV Error: Assertion failed (img.data != 0) in int wahet_main(int, char**), file jni/wahet.cpp, line 4208
该文件存在。但奇怪的是,如果我尝试使用根文件浏览器预览图像,它只是黑色。我手动复制了文件。
编辑:
在Windows下使用.png和.jpg格式的代码可以正常工作。我只是想将现有的Iris C ++ C ++项目移植到Android。
答案 0 :(得分:6)
imread()
根据文件扩展名确定的文件类型。如果文件的标题已损坏,则该方法失败是有意义的。
以下是您可以尝试的一些事项:
使用图像类型(jpg,png,tiff,bmp,...)进行测试;
出于测试目的,更直接的做法总是更好。摆脱inFile
:
示例:
Mat img = imread("/data/data/com.example.irisrec/files/input/osoba1.jpg", CV_LOAD_IMAGE_GRAYSCALE);
if (!img.data) {
// Print error message and quit
}
答案 1 :(得分:1)
调试时,首先尝试获取有关问题的更多数据。
imread()
没有提供任何错误信息,这是一个不幸的设计。由于缺少文件,权限不当,格式不受支持或格式无效,docs只会说它会失败“。然后尽可能多地产生假设。对于每一个,想一想测试它的方法。 E.g。
imread()
参数的问题。 - 尝试默认第二个参数。答案 2 :(得分:0)
我只能通过在代码中复制图像文件来解决此问题。我首先将它们存储在我的资产文件夹中,然后将它们复制到this example之后的内部存储中。 如果有人可以向我解释,请这样做。
答案 3 :(得分:0)
这可能是一个权限问题。您必须在Android 6.0或更高版本的Activity类中请求Java代码的权限。还要确保在AndroidManifest.xml中,您有以下行:
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
在您的活动文件中添加以下内容:
if (PermissionUtils.requestPermission(
this,
HOME_SCREEN_ACTIVITY,
Manifest.permission.READ_EXTERNAL_STORAGE)) {
Mat image = Imgcodecs.imread(filePath,Imgcodecs.IMREAD_COLOR);
}
我挣扎了很长时间才找到这个,而且我之前一直在获得Mat对象null
。