C ++ OpenCV imread не работает в Android

Я пытаюсь прочитать изображение в моем коде 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

Файл существует. Но странно, что если я пытаюсь просмотреть изображение с помощью Root File Browser, оно просто черное. Я скопировал туда файлы вручную.

РЕДАКТИРОВАТЬ:

Код отлично работает под Windows в форматах .png и .jpg. Я просто пытаюсь перенести существующий проект C ++ для Iris Recognition на Android.

4

Решение

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
}
6

Другие решения

При отладке сначала попытайтесь получить больше данных о проблеме.

  • Это неудачный дизайн, который imread() не предоставляет никакой информации об ошибке. документы просто скажите, что произойдет сбой «из-за отсутствия файла, неправильных разрешений, неподдерживаемого или неверного формата».
  • Используйте отладчик, чтобы войти в код, если можете. Можете ли вы сказать, где это не удается?
  • Поиск известных проблем, stackoverflow.com/search?q=imread, например imread не работает в OpenCV.

Затем сгенерируйте столько гипотез, сколько сможете. Для каждого придумайте способ проверить это. Например.

  • Файл изображения искажен (как предложено @karlphillip). — Проверьте, может ли другое программное обеспечение открыть файл.
  • Файл изображения не поддерживается форматом. — Проверьте формат файла на рабочем столе. Протестируйте, что настольный OpenCV может прочитать это. Проверьте документы, чтобы проверить форматы изображений, которые может прочитать AndroidCV.
  • Файл изображения не по ожидаемому пути. — Напишите код, чтобы проверить, есть ли файл по этому пути, и проверьте его длину.
  • Файл изображения не имеет разрешения на чтение. — Написать код, чтобы открыть файл для чтения.
  • Проблема с imread() аргументы. — Попробуйте по умолчанию второй аргумент.
1

Мне удалось решить эту проблему, только скопировав файлы изображений в коде. Сначала я сохранил их в папке с активами и скопировал их во внутреннее хранилище, а затем этот пример.
Если кто-то может объяснить это мне, пожалуйста, сделайте это.

0

Это может быть проблема с разрешением. Вам нужно будет запросить разрешение у кода Java в вашем классе Activity, например, в Android 6.0 или выше. Также убедитесь, что в вашем 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 за все время до.

0
По вопросам рекламы [email protected]