C ++ OpenCV imread在Android中不起作用

时间:2014-09-25 15:28:53

标签: android c++ opencv imread

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

4 个答案:

答案 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只会说它会失败“。
  • 如果可以,请使用调试器进入代码。你能告诉它失败的地方吗?
  • 搜索已知问题,stackoverflow.com/search?q=imread,例如imread not working in OpenCV

然后尽可能多地产生假设。对于每一个,想一想测试它的方法。 E.g。

  • 图像文件格式错误(如@karlphillip所提供)。 - 查看其他软件是否可以打开文件。
  • 图像文件不是受支持的格式。 - 验证桌面上的文件格式。测试桌面OpenCV可以读取它。检查文档以验证AndroidCV可以读取的图像格式。
  • 图像文件不在预期路径中。 - 编写代码以测试该路径上是否有文件,并验证其长度。
  • 图像文件没有读取权限。 - 编写代码打开文件进行阅读。
  • 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