Как запустить 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); и я не могу использовать это «ключевое слово» или ссылку на обратный вызов «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()); } } 

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

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

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

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

    2. Скопируйте папку libs {unzipped_opencv} / sdk / native / libs в Android Studio под app / src / main и переименуйте ее в jniLibs ( 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() , он будет выполнен в основном streamе, который может блокировать пользовательский интерфейс на дробное время. Поэтому рекомендуется загружать OpenCV в фоновом режиме, который может быть достигнут с помощью initAsync()

    Расскажите о моем пути.

    1. Скачать opencv sdk для android по адресу: https://opencv.org/releases.html
    2. Unzip opencv sdk
    3. В своем проекте (ex ADVisionProject) откройте файл settings.gradle и добавьте конфигурацию ниже

     def opencvsdk = '' include ':opencv' project(':opencv').projectDir = new File(opencvsdk + '/sdk') 

    Пример с моим файлом settings.gradle

     include ':app' def opencvsdk = '/Volumes/Data/Projects/machine-learning/OpenCV-android-sdk' include ':opencv' project(':opencv').projectDir = new File(opencvsdk + '/sdk') 
    1. В app / build.gradle добавьте opencv-модуль в зависимости

     dependencies { implementation fileTree(dir: 'libs', include: ['*.jar']) .... implementation project(':opencv') } 
    1. Напишите несколько кодов для тестирования. Примерный ниже код, он читает обратимое изображение в Mat и преобразует цвет в серый режим, преобразует Mat в Bitmap и отображает Bitmap в ImageView.

     import android.graphics.Bitmap; import android.support.v7.app.AppCompatActivity; import android.os.Bundle; import android.widget.ImageView; import org.opencv.android.OpenCVLoader; import org.opencv.android.Utils; import org.opencv.core.CvType; import org.opencv.core.Mat; import org.opencv.core.Size; import org.opencv.imgproc.Imgproc; import java.io.IOException; public class MainActivity extends AppCompatActivity { static { OpenCVLoader.initDebug(); } @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); ImageView imageView = findViewById(R.id.activity_main_iv_result); try { Mat img = Utils.loadResource(this, R.drawable.eye); Mat gryimg = new Mat(img.size(),CvType.CV_8U); Imgproc.cvtColor(img, gryimg, Imgproc.COLOR_RGB2GRAY); Bitmap bm = Bitmap.createBitmap(gryimg.cols(), gryimg.rows(), Bitmap.Config.ARGB_8888); Utils.matToBitmap(gryimg, bm); imageView.setImageBitmap(bm); } catch (IOException e) { e.printStackTrace(); } } } 
    1. Попробуйте построить apk и установить на устройство Android. Это не требуется менеджер OpenCV. Но я понимаю, что размер apk довольно большой, примерно 80 МБ

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

    Протестировано с opencv-3.4.1-android-sdk и Android Studio 3.1.3

    У нас есть способ интегрировать sdk в ваш проект. Вы должны прочитать /sdk/build.gradle для получения дополнительных параметров

    Давайте будем гением компьютера.