Как запустить OpenCV-код без OpenCv Manager

Я использую OpenCV4Android версии 2.4.10, и я проверяю свой код на Samsung Galayx GT-I9300. проблема в том, что я должен загрузить Opencv Manager из игрового магазина, чтобы мой код opencv работал, иначе приложение не запустится. Я упомянул некоторые сообщения "как показано здесь Как интегрировать OpenCV Manager в Android-приложение", чтобы узнать, как я могу запустить код opncv на андроид без необходимости загрузки OpenCV-менеджера но, к сожалению, приложение не запускается, пока OpenCV Manager не установлен.

Я попробовал следующее

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

private BaseLoaderCallback mLoaderCallback = new BaseLoaderCallback(this) {
    @Override
    public void onManagerConnected(int status) {
        switch (status) {
            case LoaderCallbackInterface.SUCCESS:
            {
                Log.i(TAG, "OpenCV loaded successfully");
                mOpenCvCameraView.enableView();
            } break;
            default:
            {
                super.onManagerConnected(status);
            } break;
        }
    }
};
...
...
...

@Override
public void onResume() {
    super.onResume();
    Log.w(TAG, "onResume");

    if (!OpenCVLoader.initDebug()) {
        Log.d(TAG, "Internal OpenCV library not found. Using OpenCV Manager for initialization");
        OpenCVLoader.initAsync(OpenCVLoader.OPENCV_VERSION_2_4_10, getActivity(), mLoaderCallback);
    } else {
        Log.d(TAG, "OpenCV library found inside package. Using it!");
        mLoaderCallback.onManagerConnected(LoaderCallbackInterface.SUCCESS);
    }
}

но это не решило проблему. Пожалуйста, дайте мне знать, как запустить opencv-код на андроид без загрузки Opencv Manager?

Обновление

использование initAsync:

Вы могли бы привести пример использования "initAsync()" в производственной версии приложения? потому что я пытался это сделать, но, конечно, я не могу использовать его в статическом блоке, потому что подпись "intiAsync" выглядит следующим образом: "OpenCVLoader.initAsync(OpenCVLoader.OPENCV_VERSION_2_4_10, this, mLoaderCallback); и я не могу использовать ключевое слово "this" или ссылку на обратный вызов" mLoaderCallback" внутри статического блока

public class MainActivity extends AppCompatActivity {

static {
    //OpenCVLoader.initDebug();
    OpenCVLoader.initAsync(OpenCVLoader.OPENCV_VERSION_2_4_10, this, mLoaderCallback); //this keyword and "mLoaderCallback" are not defined in this scope
}

private BaseLoaderCallback mLoaderCallback = new BaseLoaderCallback(this) {
    @Override
    public void onManagerConnected(int status) {
        switch (status) {
            case LoaderCallbackInterface.SUCCESS: {
                Log.i("MainActivity", "OpenCV loaded successfully");
            }
            break;
            default: {
                super.onManagerConnected(status);
            }
            break;
        }
    }
};

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    Mat m = new Mat(100, 100, CvType.CV_8UC4);
    Log.d("MainActivity", "m.width()" + m.width());
    Log.d("MainActivity", "m.height()" + m.height());
}
}

Ответ 1

Как вам нужна пошаговая процедура, поэтому я бы начал с создания проекта SampleOpenCV с нуля, а также предложил бы сделать следующие шаги в новом проекте. После того, как он начнет работать, вы можете попытаться перенести изменения к вашему основному проекту.

  • Загрузите пакет OpenCV для android из Opencv.org [Direct Скачать ссылку V3.1]
  • Распакуйте почтовый индекс в выбранное вами местоположение. Откройте проект SampleOpenCV в Android Studio, затем File → New → Import Module, который откроет новое всплывающее окно для ввода пути к модулю, выберите {unzipped_opencv}/sdk/java, это создало бы каталог OpenCVLibrary310 в SampleOpenCV.
  • Теперь откройте SampleOpenCV/OpenCVLibrary310/build.gradle и скопируйте следующие поля из SampleOpenCV/app/build.gradle:
    • compileSdkVersion
    • buildToolsVersion
    • minSdkVersion
    • targetSdkVersion
  • Теперь щелкните правой кнопкой мыши на проекте SampleOpenCV и выберите "Открыть модуль Srttings", найдите Modules >> app и выберите "Зависимости"

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

  1. Нажмите на верхний правый знак +, в поп-окне и выберите 3 Dependency Module. Теперь выберите OpenCVLibrary310. Закройте всплывающее окно и дайте gradle синхронизацию.

  2. Скопируйте папку libs {unzipped_opencv}/sdk/native/libs в Android Studio под именем app/src/main и переименуйте ее в jniLibs (обратите внимание на этот случай).

  3. Вы готовы.
public class MainActivity extends AppCompatActivity {
    static {
        OpenCVLoader.initDebug();
    }
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        Mat m = new Mat(100, 100, CvType.CV_8UC4);
    }
}

ПРИМЕЧАНИЕ: OpenCVLoader.initDebug() должно использоваться для целей отладки только как при локальном развертывании на вашем компьютере. Но для производственных целей, когда вам нужно выпустить приложение в Play Store и т.д., Вы должны использовать OpenCVLoader.initAsync(). Фактически инициализация OpenCVLoader занимает некоторое время в зависимости от телефона. Поэтому, если вы загрузите его uisng initDebug(), он будет выполнен в основном потоке, который может блокировать пользовательский интерфейс для дробного времени. Поэтому рекомендуется загружать OpenCV в фоновом режиме, который может быть достигнут с помощью initAsync()