Поиск…


Асинхронная инициализация

Использование асинхронной инициализации является рекомендуемым способом разработки приложений. Он использует OpenCV Manager для доступа к библиотекам OpenCV, установленным извне в целевой системе.

Фрагмент кода, реализующий инициализацию async:

public class MainActivity extends Activity implements CvCameraViewListener2 {

    private BaseLoaderCallback mLoaderCallback = new BaseLoaderCallback(this) {
        @Override
        public void onManagerConnected(int status) {
            switch(status) {
                case LoaderCallbackInterface.SUCCESS:
                    Log.i(TAG,"OpenCV Manager Connected");
                    //from now onwards, you can use OpenCV API
                    Mat m = new Mat(5, 10, CvType.CV_8UC1, new Scalar(0));
                    break;
                case LoaderCallbackInterface.INIT_FAILED:
                    Log.i(TAG,"Init Failed");
                    break;
                case LoaderCallbackInterface.INSTALL_CANCELED:
                    Log.i(TAG,"Install Cancelled");
                    break;
                case LoaderCallbackInterface.INCOMPATIBLE_MANAGER_VERSION:
                    Log.i(TAG,"Incompatible Version");
                    break;
                case LoaderCallbackInterface.MARKET_ERROR:
                    Log.i(TAG,"Market Error");
                    break;
                default:
                    Log.i(TAG,"OpenCV Manager Install");
                    super.onManagerConnected(status);
                    break;
            }
        }
    };

    @Override
    public void onResume() {
        super.onResume();
        OpenCVLoader.initAsync(OpenCVLoader.OPENCV_VERSION_3_1_0, this, mLoaderCallback);
    }

    ...
}

В этом случае наше приложение работает с OpenCV Manager в асинхронном режиме. OnManagerConnected обратный вызов будет вызываться в потоке пользовательского интерфейса, когда инициализация завершается.

Обратите внимание, что до вызова этого обратного вызова запрещается использовать вызовы OpenCV или загружать зависящие от OpenCV собственные библиотеки. Загрузите собственные библиотеки, которые зависят от OpenCV после успешной инициализации OpenCV.

По умолчанию BaseLoaderCallback реализует контекст приложения как Activity и вызывает метод Activity.finish() для выхода в случае отказа инициализации. Чтобы переопределить это поведение, вам необходимо переопределить метод finish() класса BaseLoaderCallback и реализовать свой собственный метод финализации.

OpenCV Manager

OpenCV Manager - это служба Android, предназначенная для управления двоичными файлами библиотеки OpenCV на устройствах конечных пользователей. Он позволяет совместно использовать динамические библиотеки OpenCV между приложениями на одном устройстве.

Менеджер предоставляет следующие преимущества:

  • Меньше использования памяти (около 40 МБ). Все приложения используют одни и те же двоичные файлы из службы и не содержат внутри себя собственные библиотеки.
  • Оптимизация оборудования для всех поддерживаемых платформ.
  • Надежный источник библиотеки OpenCV. Все пакеты с OpenCV публикуются на рынке Google Play.
  • Регулярные обновления и исправления ошибок.

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

Дополнительная информация: Android OpenCV Manager

Обновлено 18/10/16:
В версии OpenCV Manager, распространяемой в Play Store, есть ошибка (обновлено 21/09/15).
Это влияет только на версию OpenCV 3.1.0. Когда вы запускаете некоторые функции OpenCV, вы получаете ошибку SIGSEGV . Версия, распространяемая с Android SDK, отлично работает ( OpenCV-android-sdk/apk/OpenCV_3.1.0_Manager_3.10_{platform}.apk ). Его можно загрузить с сайта OpenCV .
Дополнительная информация: выпуск № 6247 .

Статическая инициализация

Согласно этому подходу все файлы OpenCV включены в ваш пакет приложений. Он предназначен в основном для разработки и отладки. Этот подход устарел для производственного кода, рекомендуется инициализация асинхронного режима.

Если ваш проект приложения не имеет части JNI, просто скопируйте соответствующие родные библиотеки OpenCV из OpenCV-3.1.0-android-sdk/sdk/native/libs в каталог вашего проекта в папку app/src/main/jniLibs .

В случае проекта приложения с частью JNI вместо ручного копирования библиотек вам необходимо изменить файл Android.mk : добавьте следующие две строки кода после "include $(CLEAR_VARS)" и до "include path_to_OpenCV-3.1.0-android-sdk/sdk/native/jni/OpenCV.mk" :

OPENCV_CAMERA_MODULES:=on
OPENCV_INSTALL_MODULES:=on

Результат должен выглядеть следующим образом:

include $(CLEAR_VARS)
# OpenCV
OPENCV_CAMERA_MODULES:=on
OPENCV_INSTALL_MODULES:=on
include ../../sdk/native/jni/OpenCV.mk

После этого библиотеки OpenCV будут скопированы в папку jniLibs вашего приложения во время сборки JNI.

Последним шагом включения OpenCV в ваше приложение является код инициализации Java перед вызовом API OpenCV. Это можно сделать, например, в статическом разделе класса Activity:

static {
    if (!OpenCVLoader.initDebug()) {
        // Handle initialization error
    }
}

Если приложение включает другие родственные библиотеки, зависящие от OpenCV, вы должны загрузить их после инициализации OpenCV:

static {
    if (!OpenCVLoader.initDebug()) {
        // Handle initialization error
    } else {
        System.loadLibrary("my_jni_lib1");
        System.loadLibrary("my_jni_lib2");
    }
}

Примечание. initDebug() устарел для производственного кода. Он предназначен только для экспериментального и локального развития. Если вы хотите опубликовать свой подход к использованию приложения с инициализацией async.



Modified text is an extract of the original Stack Overflow Documentation
Лицензировано согласно CC BY-SA 3.0
Не связан с Stack Overflow