2014-09-25 4 views
4

Я пытаюсь прочитать изображение в моей C++ кодC++ OpenCV не imread работает в Android

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, это просто черное. Я скопировал файлы там вручную.

EDIT:

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

ответ

0

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

+1

imread не может прочитать из zip-файла (ваш apk). поэтому вам сначала нужно скопировать его в другом месте. – berak

+0

* ПОЖАЛУЙСТА *, запустите новый вопрос ... – berak

+0

И переосмыслить свой ответ - я не уверен, что папка данных/данных имеет какое-либо отношение к apk? – 4ndro1d

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 
} 
+0

Они не повреждены при копировании их и я не вижу никаких проблем с разрешением на внутреннее хранилище Android. Я пробовал с jpg и png. Оба не работают. Код работает нормально под окнами. Также я не хочу изменять код C++, поскольку я пытаюсь перенести весь проект на Android. Это Инструментарий распознавания радужной оболочки с слишком большим количеством строк кода для адаптации. И я уверен, что путь к файлу верен. – 4ndro1d

1

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

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

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

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

См. Мой комментарий к другому ответу. – 4ndro1d

+0

О да, и я попытаюсь отладить код C++. Не удалось настроить отладчик правильно – 4ndro1d

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); 
} 

Я боролся долгое время, чтобы найти это, и я получаю Матовый объект null за все время раньше.