Я пытаюсь прочитать изображение в моем коде 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.
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()
не предоставляет никакой информации об ошибке. документы просто скажите, что произойдет сбой «из-за отсутствия файла, неправильных разрешений, неподдерживаемого или неверного формата».Затем сгенерируйте столько гипотез, сколько сможете. Для каждого придумайте способ проверить это. Например.
imread()
аргументы. — Попробуйте по умолчанию второй аргумент.Мне удалось решить эту проблему, только скопировав файлы изображений в коде. Сначала я сохранил их в папке с активами и скопировал их во внутреннее хранилище, а затем этот пример.
Если кто-то может объяснить это мне, пожалуйста, сделайте это.
Это может быть проблема с разрешением. Вам нужно будет запросить разрешение у кода 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
за все время до.