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

C++ OpenCV imread not working in Android

本文关键字:不起作用 Android imread C++OpenCV      更新时间:2023-10-16

我正在尝试读取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下运行良好。我只是想把现有的虹膜识别C++项目移植到Android上。

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
}

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

  • imread()没有提供任何错误信息,这是一个不幸的设计。文档只是说它会失败,"因为缺少文件、权限不正确、格式不受支持或无效"
  • 如果可以的话,可以使用调试器逐步进入代码。你能说出它在哪里失败了吗
  • 搜索已知问题,stackoverflow.com/Search?q=imread,例如imread在OpenCV中不起作用

然后生成尽可能多的假设。对于每一个,想一种方法来测试它。例如

  • 图像文件格式不正确(正如@karlphillip提供的那样)。--查看其他软件是否可以打开该文件
  • 图像文件不是支持的格式。--验证桌面上的文件格式。测试桌面OpenCV是否可以读取。检查文档以验证AndroidCV可以读取的图像格式
  • 图像文件不在预期的路径上。--编写代码来测试该路径上是否有文件,并验证其长度
  • 图像文件没有读取权限。--编写代码以打开文件进行读取
  • imread()参数有问题。——尝试默认第二个参数

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

这可能是权限问题。在Android 6.0或更高版本中,您必须从活动类中的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