Как прочитать изображение в объект Mat с помощью opencv c ++ и Android Studio ndk? - PullRequest
0 голосов
/ 03 сентября 2018

Я искал несколько часов и не могу найти ответ на свой вопрос (ы). Я написал следующие строки кода в Android ndk (c ++), и я использую необходимые библиотеки opencv для выполнения этой задачи.

void opening_images(){
    Mat image ;
    sillyString = "I have changed";
    String imagePath = "//drawable//ring.png";

    image = imread(imagePath,IMREAD_COLOR);

    if(image.empty()){
        sillyString = "Image not loaded";

    }
    else {
        sillyString = "Image loaded";

    }
}

Я тестировал этот код в Qt с opencv, и он работает нормально. В настоящий момент программа в Android Studio возвращает строку «Изображение не загружено». Я думаю, что основная проблема заключается в том, что я не совсем понимаю, как работать с путями к файлам? В андроид студии я включил картинку под res / drawable / ring.png. Я могу просмотреть это изображение с помощью Java-приложения.

Вопрос 1 : Является ли указанный imagePath = "//drawable//ring.png" правильным для доступа к файлу ring.png? Вопрос 2: Требуются ли какие-либо разрешения, позволяющие ndk получать доступ к папкам res? Вопрос 3: Существуют ли аналогичные методы для присвоения изображения объекту Mat?

Любая помощь будет оценена.

Редактировать:

The directories

Ответы [ 3 ]

0 голосов
/ 10 сентября 2018

Другой способ использования сохраненного изображения в NDK:

Чем папка для рисования, вы можете сохранить ее в папке assets . Это также позволяет легко получить доступ к нескольким изображениям.

Тогда BitmapFactory.decodeStream помогает принять его как растровое изображение, а Utils.bitmapToMat используется для преобразования растрового изображения изображения в Mat файл.

Затем этот файл Mat вы можете передать в NDK и обработать его с помощью OpenCV C ++.

Спасибо

0 голосов
/ 11 сентября 2018

Так как я впервые использовал Android Studio, я многому научился. Это заняло у меня некоторое время, но вот ответы на вопросы, которые я отправил.

Вопрос 1: Является ли указанный imagePath = "//drawable//ring.png" правильным для доступа к файлу ring.png?

Скорее всего, это неправильный путь для доступа к изображениям с целью обработки изображений и т. Д. Выдвижная папка все еще может использоваться для обновления ex. просмотр изображения путем установки src для просмотра изображения на изображение

 imageView.setImageResource(R.drawable.ring);

При работе с изображениями и объектами Mat я обнаружил, что лучше всего использовать мост отладки Android для копирования файлов на SD-карту устройства. Эта ссылка предоставит вам необходимые шаги для установки adb https://www.howtogeek.com/125769/how-to-install-and-use-abd-the-android-debug-bridge-utility/

По завершении копирования изображений на SD-карту. Путь к файлу можно найти, используя встроенную функцию Java Environment.getExternalStorageDirectory(). Что выглядит примерно так: /storage/emulated/0/YOUR_file, это зависит от места, в которое были скопированы файлы.

Полезный совет: Загрузка ES File Explorer для устройства, помогающего перемещаться по внешнему или внутреннему хранилищу.

Вопрос 2. Требуются ли какие-либо разрешения, позволяющие ndk получать доступ к папкам res? Метод, который я использовал, не нуждался в каких-либо разрешениях. Однако в настоящее время сторона NDK не может напрямую считывать изображение с SD-карты, изображение должно быть передано со стороны Java с использованием assets или , передавая адрес изображения который был прочитан в объект Mat (сторона Java).

Для доступа к SD-карте необходимо разрешение на чтение и запись. Это должно быть установлено в manifest.xml и должно быть правильно реализовано в коде. На YouTube много хороших учебников.

Вопрос 3: Существуют ли аналогичные методы для присвоения изображения объекту Mat? Этот вопрос сейчас кажется излишним, есть много способов снять кожу с кошки .

Короче говоря, я думаю, что при использовании Opencv4Android легче придерживаться стороны Java, и требуется некоторая форма обработки изображений. Чтобы начать работу с Java, приведу небольшой фрагмент моего кода.

Mat image;
String imageInSD = Environment.getExternalStorageDirectory()+"/Pictures/Data/Birds/"(ImageFolders[i])+"/"+String.valueOf(id)+".png";

image = Imgcodecs.imread(imageInSD,Imgcodecs.IMREAD_COLOR);

Удачи !!

0 голосов
/ 03 сентября 2018

Если вы посмотрите, как работает ресурс декодирования BitmapFactory - вы увидите, что получение растрового изображения из прорисовываемого объекта все еще требует распаковки сжатого изображения.

Итак, ответьте на вопрос q1: нет, это неправильный способ доступа к ring.png, вам придется либо загрузить ресурс на ваше устройство, либо распаковать его в byteArray и использовать imdecode вместо imread

...