Как запустить 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
и выберите "Зависимости"
![введите описание изображения здесь]()
-
Нажмите на верхний правый знак +, в поп-окне и выберите 3 Dependency Module. Теперь выберите OpenCVLibrary310
. Закройте всплывающее окно и дайте gradle синхронизацию.
-
Скопируйте папку libs {unzipped_opencv}/sdk/native/libs в Android Studio под именем app/src/main и переименуйте ее в jniLibs
(обратите внимание на этот случай).
- Вы готовы.
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()
Ответ 2
В GitHub есть пример кода, который использует метод initAsync() и решает проблему зависимости менеджера Opencv Пример интеграции NDK и удаления зависимости Opencv