OpenCV в Android Studio

146

Я хочу использовать библиотеку OpenCV в своем приложении с Android Studio. Я выполнил инструкции, найденные здесь, но получаю ошибку

Конфигурация с именем default не найдена

Что может быть не так?

Я использую Android Studio 1.0 с gradle 2.2.1.

Бартош Бялецки
источник
1
Теперь мы могли импортировать модули с помощью Android Studio, и шаги стали намного проще. Можете ли вы попробовать этот stackoverflow.com/a/27356635/1180117
Kiran
Спасибо, это работает. Напишите это как ответ, и я приму его.
Bartosz Bialecki
@BartoszBialecki @Kiran, я перешел к шагу 4, я не могу найти nativeкаталог в моем sdk каталоге. Я что-то упустил?
Romantic Electron
1
@RanticElectron вам нужно добавить каталог natvie из sdk библиотеки OpenCV, а не из Android sdk.
Bartosz Bialecki
@BartoszBialecki благодарит
Romantic Electron

Ответы:

317

Следующие шаги для использования Android OpenCV sdk в Android Studio. Это упрощенная версия этого ( 1 ) ответа SO.

  1. Загрузите последнюю версию OpenCV sdk для Android с OpenCV.org и распакуйте zip-файл.
  2. Импортируйте OpenCV в Android Studio , From File -> New -> Import Module , выберите папку sdk / java в распакованном архиве opencv.
  3. Обновите build.gradle в импортированном модуле OpenCV, чтобы обновить 4 поля в соответствии с вашим проектом build.gradle a) compileSdkVersion b) buildToolsVersion c) minSdkVersion и d) targetSdkVersion.
  4. Добавьте зависимость модуля через Application -> Module Settings и выберите вкладку Dependencies . Щелкните значок + внизу, выберите « Зависимость модуля» и выберите импортированный модуль OpenCV.
    • Для Android Studio v1.2.2, чтобы получить доступ к настройкам модуля: в представлении проекта щелкните правой кнопкой мыши зависимый модуль -> Открыть настройки модуля.
  5. Скопируйте папку libs в sdk / native в Android Studio в app / src / main .
  6. В Android Studio переименуйте скопированный каталог libs в jniLibs, и все готово.

Шаг (6) связан с тем, что студия Android ожидает, что app/src/main/jniLibsвместо старой libsпапки будут использоваться собственные библиотеки . Для тех, кто плохо знаком с Android OpenCV, не пропустите следующие шаги

  • include static{ System.loadLibrary("opencv_java"); }(Примечание: для OpenCV версии 3 на этом этапе вы должны вместо этого загрузить библиотеку opencv_java3.)
  • Для шага (5), если вы игнорируете какие-либо библиотеки платформы, такие как x86, убедитесь, что ваше устройство / эмулятор не на этой платформе.

OpenCV написан на C / C ++. Оболочки Java

  1. Android OpenCV SDK - OpenCV.org поддерживает оболочку Android Java. Я предлагаю это.
  2. OpenCV Java - OpenCV.org поддерживает автоматически сгенерированную оболочку Java рабочего стола.
  3. JavaCV - популярная оболочка Java, поддерживаемая независимыми разработчиками. Не для Android. Эта библиотека может не синхронизироваться с более новыми версиями OpenCV.
Kiran
источник
1
Я получаю сообщение об ошибке после второго шага: «Удалить javadocsкаталог?». Он также предлагает мне установить, android sdk 14хотя я нацелен на устройства, которые поддерживаютandroid sdk 15
Romantic Electron
1
@RanticElectron Надеюсь, вы скачали OpenCV4Android 2.4.10 по ссылке sourceforge.net/projects/opencvlibrary/files/opencv-android/…, а не эту настольную версию Java?
Kiran
2
Хорошо, я понял, я думал, что вы говорили об sdkустановочном каталоге в моей системе, в то время как вы говорили о каталоге, который поставляется с Android Open CV SDK.Ok, завершил шаг 6. Где я могу включить static{ System.loadLibrary("opencv_java"); }?
Romantic Electron
5
@RanticElectron, где вы включаете статическую {System.loadLibrary ("opencv_java"); }? Вы говорите: «Спасибо, я получил», но, похоже, между ними нет никакого сообщения. Тогда вы говорите, что в этом нет необходимости. Не могли бы вы объяснить еще немного? Спасибо.
puntofisso
8
для всех, у кого возникла android-14ошибка после импорта модуля на шаге 2, вам необходимо вручную отредактировать build.gradleфайл в каталоге openCV в вашем проекте, как показано на шаге 3.
paradite
145

Интеграция OpenCV v3.1.0 в Android Studio v1.4.1 , инструкции с дополнительными подробностями и скриншоты типа "это то, что вы должны получить".

Большая заслуга в объяснениях Kiran, Kool, 1 "и SteveLiles на opencv.org. Я добавляю этот ответ, потому что считаю, что интерфейс Android Studio теперь достаточно стабилен, чтобы работать с этим типом интеграции. Кроме того, я все равно должен написать эти инструкции для нашего проекта.

Опытные разработчики AS найдут часть этого педантизма. Этот ответ предназначен для людей с ограниченным опытом работы с Android Studio.

  1. Создайте новый проект Android Studio с помощью мастера проектов (Меню: / Файл / Новый проект):

    • Назовите это " cvtest1 "
    • Форм-фактор: API 19, Android 4.4 (KitKat)
    • Пустое действие с именем MainActivity

      У вас должен быть каталог cvtest1, в котором хранится этот проект. (строка заголовка Android studio показывает, где находится cvtest1, когда вы открываете проект)

  2. Убедитесь, что ваше приложение работает правильно. Попробуйте изменить что-нибудь вроде текста «Hello World», чтобы убедиться, что цикл сборки / тестирования вам подходит. (Тестирую с эмулятором устройства API 19).

  3. Загрузите пакет OpenCV для Android v3.1.0 и распакуйте его где-нибудь во временном каталоге. (Убедитесь, что это пакет специально для Android, а не только пакет OpenCV для Java.) Я назову этот каталог « unzip-dir ». Ниже unzip-dir у вас должен быть каталог sdk / native / libs с подкаталогами, которые начинаются с такие вещи, как arm ..., mips ... и x86 ... (по одному для каждого типа "архитектуры", на которой работает Android)

  4. Из Android Studio импортируйте OpenCV в свой проект как модуль: Menu: / File / New / Import_Module :

    • Исходный каталог: {unzip-dir} / sdk / java
    • Имя модуля: Android studio автоматически заполняет это поле с помощью openCVLibrary310 (точное имя, вероятно, не имеет значения, но мы пойдем с этим).
    • Нажмите " Далее" . Вы получите экран с тремя флажками и вопросами о jar-файлах, библиотеках и параметрах импорта. Следует проверить все три. Щелкните Готово.

      Android Studio начинает импортировать модуль, и вам отображается файл import-summary.txt , содержащий список того, что не было импортировано (в основном файлы javadoc), и другую информацию. введите описание изображения здесь

      Но вы также получите сообщение об ошибке , говорящее не удалось найти цель с хэш строки «андроид-14» ... . Это происходит из-за того, что файл build.gradle в загруженном вами zip-файле OpenCV говорит о компиляции с использованием Android API версии 14, чего по умолчанию у вас нет в Android Studio v1.4.1. введите описание изображения здесь

  5. Откройте диалог структуры проекта ( Меню: / Файл / Структура_проекта ). Выберите модуль «приложение», щелкните вкладку « Зависимости » и добавьте : openCVLibrary310 в качестве зависимости модуля. Когда вы выбираете Add / Module_Dependency, он должен появиться в списке модулей, которые вы можете добавить. Теперь он будет отображаться как зависимость, но вы получите еще несколько ошибок « невозможно найти-android-14» в журнале событий.

  6. Найдите в файле build.gradle свой модуль приложения. В проекте Android есть несколько файлов build.gradle. Тот, который вам нужен, находится в каталоге cvtest1 / app, и с точки зрения проекта он выглядит как build.gradle (Module: app) . Обратите внимание на значения этих четырех полей:

    • compileSDKVersion (мой говорит 23)
    • buildToolsVersion (мой говорит 23.0.2)
    • minSdkVersion (мой говорит 19)
    • targetSdkVersion (мой говорит 23)
  7. Теперь в вашем проекте есть каталог cvtest1 / OpenCVLibrary310, но он не отображается в представлении проекта:

введите описание изображения здесь

Воспользуйтесь другим инструментом, например, файловым менеджером, и перейдите в этот каталог. Вы также можете переключить представление проекта с Android на файлы проекта, и вы можете найти этот каталог, как показано на этом снимке экрана: введите описание изображения здесь

Внутри есть еще один файл build.gradle (он выделен на скриншоте выше). Обновите этот файл четырьмя значениями из шага 6.

  1. Выполните повторную синхронизацию проекта, а затем очистите / перестройте его. (Меню: / Build / Clean_Project ) Он должен очищать и строить без ошибок, и вы должны увидеть много ссылок на : openCVLibrary310 на экране 0: Сообщения .

    введите описание изображения здесь

    На этом этапе модуль должен появиться в иерархии проекта как openCVLibrary310 , как и app . (Обратите внимание, что в этом маленьком раскрывающемся меню я переключился обратно с Project View на Android View ). Вы также должны увидеть дополнительный файл build.gradle в разделе «Сценарии Gradle», но я считаю, что интерфейс Android Studio немного глючит, и иногда он делает это не сразу. Так что попробуйте повторно синхронизировать, очистить или даже перезапустить Android Studio.

    Вы должны увидеть модуль openCVLibrary310 со всеми функциями OpenCV под java, как на этом снимке экрана:

    введите описание изображения здесь

  2. Скопируйте каталог {unzip-dir} / sdk / native / libs (и все, что находится под ним) в свой проект Android в cvtest1 / OpenCVLibrary310 / src / main / , а затем переименуйте свою копию из libs в jniLibs . Теперь у вас должен быть каталог cvtest1 / OpenCVLibrary310 / src / main / jniLibs . Выполните повторную синхронизацию проекта, и теперь этот каталог должен появиться в представлении проекта в openCVLibrary310 .

    введите описание изображения здесь

  3. Перейдите к методу onCreate файла MainActivity.java и добавьте этот код:

    if (!OpenCVLoader.initDebug()) {
        Log.e(this.getClass().getSimpleName(), "  OpenCVLoader.initDebug(), not working.");
    } else {
        Log.d(this.getClass().getSimpleName(), "  OpenCVLoader.initDebug(), working.");
    }
    

    Затем запустите ваше приложение. Вы должны увидеть такие строки в Android Monitor: введите описание изображения здесь (я не знаю, почему там эта строка с сообщением об ошибке)

  4. Теперь попробуйте на самом деле использовать некоторый код openCV. В приведенном ниже примере я скопировал файл .jpg в каталог кеша приложения cvtest1 на эмуляторе Android. Приведенный ниже код загружает это изображение, запускает алгоритм распознавания краев и затем записывает результаты обратно в файл .png в том же каталоге.

    Поместите этот код чуть ниже кода из предыдущего шага и измените его, чтобы он соответствовал вашим собственным файлам / каталогам.

    String inputFileName="simm_01";
    String inputExtension = "jpg";
    String inputDir = getCacheDir().getAbsolutePath();  // use the cache directory for i/o
    String outputDir = getCacheDir().getAbsolutePath();
    String outputExtension = "png";
    String inputFilePath = inputDir + File.separator + inputFileName + "." + inputExtension;
    
    
    Log.d (this.getClass().getSimpleName(), "loading " + inputFilePath + "...");
    Mat image = Imgcodecs.imread(inputFilePath);  
    Log.d (this.getClass().getSimpleName(), "width of " + inputFileName + ": " + image.width());
    // if width is 0 then it did not read your image.
    
    
    // for the canny edge detection algorithm, play with these to see different results
    int threshold1 = 70;
    int threshold2 = 100;
    
    Mat im_canny = new Mat();  // you have to initialize output image before giving it to the Canny method
    Imgproc.Canny(image, im_canny, threshold1, threshold2);
    String cannyFilename = outputDir + File.separator + inputFileName + "_canny-" + threshold1 + "-" + threshold2 + "." + outputExtension;
    Log.d (this.getClass().getSimpleName(), "Writing " + cannyFilename);
    Imgcodecs.imwrite(cannyFilename, im_canny);
    
  5. Запустите ваше приложение. Ваш эмулятор должен создать черно-белое "краевое" изображение. Вы можете использовать Android Device Monitor для получения вывода или написать действие, чтобы показать его.

В Gotchas :

  • Если вы опустите целевую платформу ниже KitKat, некоторые из библиотек OpenCV больше не будут работать, в частности классы, связанные с org.opencv.android.Camera2Renderer и другими связанными классами. Вероятно, вы можете обойти это, просто удалив соответствующие файлы OpenCV .java.
  • Если вы поднимете целевую платформу до Lollipop или выше, мой пример загрузки файла может не работать, потому что использование абсолютных путей к файлам не одобряется. Поэтому вам, возможно, придется изменить пример, чтобы загрузить файл из галереи или где-то еще. Есть множество примеров, плавающих вокруг.
ssimm
источник
2
Редактирование от 16 февраля: jniLibs теперь в каталоге openCVLibrary310, а не в основном каталоге приложения. Либо работает, но мне кажется более чистым, чтобы сохранить их в части opencv. Плюс еще скриншоты и часть "Попадания".
ssimm
Я думаю, что некоторые операторы импорта отсутствуют, в остальном очень хорошая работа! +1
Аллан Норгаард
1
Я последовал твоему ответу, но не смог. 1 я получил ошибку OpenCV error: Cannot load info library for OpenCV 2 java.lang.UnsatisfiedLinkError: dalvik.system.PathClassLoader[DexPathList[[zip file "/data/app/www.deven.com.opencv-2/base.apk"],nativeLibraryDirectories=[/vendor/lib, /system/lib]]] couldn't find "libopencv_java3.so что это за ошибка я сделал шаг за шагом, как вы написали.
Девендра Сингх
2
@DevendraSingh У меня та же ошибка, что и у вас, но я понял, что пропустил шаг 9.
aasu
2
что, если мы хотим писать код на C ++ для opencv в студии Android?
user8663682
40

Для всех, кто чувствовал, что они хотят убежать со всеми шагами и снимками экрана в ответах (отлично!) Выше, это сработало для меня с android studio 2.2.1:

  1. Создайте новый проект, назовите его как хотите и используйте значение по умолчанию (minSdkVersion 15 подойдет).

  2. Загрузите zip-файл отсюда: https://sourceforge.net/projects/opencvlibrary/files/opencv-android/ (я загрузил версию 3.2.0, но могут быть и более новые версии).

  3. Разархивируйте zip-файл, лучше всего в папке рабочей области, но это не имеет особого значения.

  4. Внутри Android Studioщелкните File->New-> Import Moduleи перейдите к \path_to_your_unzipped_file\OpenCV-android-sdk\sdk\javaокну, затем примите все диалоговые окна по умолчанию.

  5. В gradleфайле вашего app модуля добавьте это в блок зависимостей:

     dependencies {
         compile project(':openCVLibraryXYZ')
         //rest of code
     }
    

Где XYZ - это точная версия, которую вы скачали, например, в моем случае:

    dependencies {
        compile project(':openCVLibrary320')
        //rest of code
    }
Ишахак
источник
1
Красиво и просто, thnx ;-) Работает также для версии 3.2.0.
blacharnia
3
Спасибо, это действительно более простое решение. Одно очко от меня. Не удалось скомпилировать новый модуль OpenCV. Ответ здесь помог мне исправить эту проблему stackoverflow.com/a/40302788/408780
Tima
просто чтобы добавить к тому, что сказал @blacharnia, просто убедитесь, что вы используете 'compile project (': openCVLibrary320 ')' в разделе зависимостей колыбели вместо 310
Авраам Филип
Возможно, в более общем плане, чтобы добавить к приведенным выше комментариям, используйте "compile project (': openCVLibraryXYZ')", где XYZ - это номер версии openCV Android SDK без "точек" - теперь это также работает для версии 3.4.0 -> т.е. используйте «скомпилировать проект (': openCVLibrary340')»
Мик
@Mick спасибо, я отредактировал ответ в соответствии с вашим предложением.
yshahak
11

Android Studio 3.4 + OpenCV 4.1

  1. Загрузите последний zip-файл OpenCV отсюда ( последняя версия - 4.1.0) и распакуйте его в своем рабочем пространстве или в другой папке.

  2. Создайте новый проект Android Studio обычным образом. Щелкните File->New->Import Module, перейдите к /path_to_unzipped_files/OpenCV-android-sdk/sdk/java, установите имя модуля как opencv, щелкните Nextи снимите флажки со всех параметров на экране.

  3. Включите Projectрежим просмотра файлов (режим по умолчанию Android). В opencv/build.gradleфайле измените apply plugin: 'com.android.application'на apply plugin: 'com.android.library'и замените application ID "org.opencv"на

    minSdkVersion 21
    targetSdkVersion 28
    

    (согласно значениям в app/build.gradle). Синхронизировать проект с файлами Gradle.

  4. Добавьте эту строку в блок зависимостей в app/build.gradleфайле

    dependencies {
        ...
        implementation project(path: ':opencv')
        ...
    }
    
  5. Снова Androidвыберите режим просмотра файлов. Щелкните правой кнопкой мыши appмодуль и перейдите к New->Folder->JNI Folder. Выберите изменить расположение папки и установите src/main/jniLibs/.

  6. Снова Projectвыберите режим просмотра файлов и скопируйте все папки из /path_to_unzipped_files/OpenCV-android-sdk/sdk/native/libsв app/src/main/jniLibs.

  7. Снова в Androidрежиме просмотра файлов щелкните правой кнопкой мыши appмодуль и выберите Link C++ Project with Gradle. Выберите систему сборки ndk-buildи путь к OpenCV.mkфайлу /path_to_unzipped_files/OpenCV-android-sdk/sdk/native/jni/OpenCV.mk.

    path_to_unzipped_files не должно содержать пробелов, иначе вы получите ошибку!

Чтобы проверить инициализацию OpenCV, добавьте сообщение Toast в onCreate()метод MainActivity :

Toast.makeText(MainActivity.this, String.valueOf(OpenCVLoader.initDebug()), Toast.LENGTH_LONG).show();

Если инициализация прошла успешно, вы увидите trueсообщение Toast, иначе вы увидите false.

Пло_Коон
источник
Выше вы говорите "заменить идентификатор приложения" org.opencv "на .....", но после "с" ничего не идет. Не могли бы вы уточнить? Вы хотите сказать «удалите запись applicationId и добавьте две записи следующим образом:»
Дейл
@Dale Да, вам следует заменить application ID "org.opencv"строку двумя строками: minSdkVersion 21и targetSdkVersion 28(в соответствии со значениями в файле app / build.gradle)
Plo_Koon
Я выполнил все шаги, как вы описали. Но получить ошибку E / art: dlopen ("/ data / app / com.example.objectsegmentation-1 / lib / arm64 / libopencv_java4.so", RTLD_LAZY) не удалось: ошибка dlopen: библиотека "libc ++ _ shared.so" не найдена
Мастхан
1

Это сработало для меня и было так же просто, как добавить зависимость от градиента:

https://bintray.com/seesaa/maven/opencv#

https://github.com/seesaa/opencv-android

Единственное предостережение: мне пришлось использовать аппаратное отладочное устройство, так как эмуляторы рук работали для меня слишком медленно (как утверждает AVD Manager), и, как описано в README репозитория, эта версия не включает поддержку x86 или x86_64.

Вроде строится и предлагаемый тест:

static {
    OpenCVLoader.initDebug();
}

выплевывает кучу результатов, которые мне нравятся.

Наумдев
источник
Это был свежий проект в студии Android. Я ничего не импортировал, ничего не скачивал и т. Д. Просто добавьте зависимость gradle и синхронизируйте.
Наумдев
1
Download

Получите последнюю готовую версию OpenCV для Android с https://github.com/opencv/opencv/releases готовую версию и распакуйте ее (например, opencv-4.4.0-android-sdk.zip).

Создайте пустой проект Android Studio

Open Android Studio. Start a new project. 

введите описание изображения здесь

Оставьте целевые настройки по умолчанию.

Используйте шаблон «Пустое действие». Назовите действие MainActivity с соответствующим макетом activity_main. Подключите свое устройство и запустите проект. Он должен быть установлен и успешно запущен, прежде чем мы продолжим.

 Add OpenCV dependency

Перейдите в Файл-> Создать-> Модуль импорта.

и укажите путь к unpacked_OpenCV_package / sdk / java. Название модуля определяется автоматически. Отключите все функции, которые Android Studio предложит вам в следующем окне.

введите описание изображения здесь

введите описание изображения здесь

Настройте свою библиотеку build.gradle (openCVLibrary build.gradle)

apply plugin: 'com.android.library'

android {
    compileSdkVersion 28
    buildToolsVersion "28.0.3"

    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.txt'
        }
    }
}

Внедрить библиотеку в проект (приложение build.gradle)

 implementation project(':openCVLibrary330')
шохрух Максмудов
источник
0

Отображается любой, кто сталкивается с проблемой при создании jniLibs cpp .. просто добавьте ndk ..

Аклеш Сингх
источник