5

我正在尝试在我的 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

文件存在。但奇怪的是,如果我尝试使用根文件浏览器预览图像,它只是黑色的。我手动复制了那里的文件。

编辑:

该代码在 .png 和 .jpg 格式的 Windows 下运行良好。我只是想将 Iris Recognition 的现有 C++ 项目移植到 Android。

4

4 回答 4

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
}
于 2014-09-29T03:56:02.593 回答
1

调试时,首先尝试获取有关问题的更多数据。

  • 这是一个imread()不提供任何错误信息的不幸设计。文档只是说它会“因为丢失文件、不正确的权限、不受支持或无效的格式”而失败。
  • 如果可以,请使用调试器单步执行代码。你能告诉它失败的地方吗?
  • 搜索已知问题,stackoverflow.com /search?q=imread ,例如imread 在 OpenCV 中不起作用

然后尽可能多地提出假设。对于每一个,想一个方法来测试它。例如

  • 图像文件格式错误(如@karlphillip 提供的那样)。-- 看看其他软件能不能打开文件。
  • 图像文件不是受支持的格式。-- 验证您桌面上的文件格式。测试桌面 OpenCV 是否可以读取它。检查文档以验证 AndroidCV 可以读取的图像格式。
  • 图像文件不在预期的路径中。-- 编写代码来测试该路径是否有文件,并验证其长度。
  • 图像文件没有读取权限。-- 编写代码以打开文件进行读取。
  • imread()论据有问题。-- 尝试默认第二个参数。
于 2014-09-29T07:41:43.477 回答
1

我只能通过在代码中复制图像文件来解决这个问题。我首先将它们存储在我的资产文件夹中,然后按照这个示例将它们复制到内部存储中。如果有人可以向我解释这一点,请这样做。

于 2014-09-30T12:17:44.783 回答
1

这可能是权限问题。在 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

于 2017-08-09T21:47:44.357 回答