user2121 user2121 - 16 days ago 11
Android Question

How to run OpenCV code without OpenCv Manager

I am using OpenCV4Android version 2.4.10 and i test my code on Samsung Galayx GT-I9300. the problem i have is, that i must download Opencv Manager from play store so that my opencv code runs, otherwise the App would not start.
I referred to some postes "as shown here How to integrate OpenCV Manager in Android App" to know how can i run the opncv code on android without the need to download OpenCV manager
but unfortunately the App doesnt start as long as OpenCV Manager is not installed.

i tried the follwoing

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);
}
}


but that did not solve the problem.
Please let me know how to run opencv code on android without downloading Opencv Manager ?

Update:

use of initAsync:

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());
}
}

Answer

As you want step by step procedure, So I would start with creating a SampleOpenCV project from scratch, and would also suggest to do the following steps in a new project, Once it starts working you may try to migrate the changes to your main project.

  1. Download OpenCV package for android from Opencv.org [ Direct Download Link V3.1 ]
  2. Unpack the zip to a location of your choice, Open the SampleOpenCV project in Android Studio, then File -> New -> Import Module, which would open a new pop-up to enter the module path, select {unzipped_opencv}/sdk/java, this would create a OpenCVLibrary310 directory under SampleOpenCV.
  3. Now Open SampleOpenCV/OpenCVLibrary310/build.gradle and copy the following fields from SampleOpenCV/app/build.gradle:
    • compileSdkVersion
    • buildToolsVersion
    • minSdkVersion
    • targetSdkVersion
  4. Now right click on your SampleOpenCV project and click Open Module Srttings, look for Modules >> app and select Dependencies

enter image description here

  1. Click at the top-right + sign, in the pop window, and select 3 Module Dependency. Now choose OpencvLibrary310. Close the pop up and let the gradle sync.

  2. Copy libs folder {unzipped_opencv}/sdk/native/libs to Android Studio under app/src/main and rename from it to jniLibs (Mind the case here).

  3. You are Done.

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);
    }
}

NOTE: OpenCVLoader.initDebug() must be used for debugging purposes only as when you are developing locally on your machine. But for production purposes where you need to release the app on Play Store, etc. you must use OpenCVLoader.initAsync(). Actually initializing the OpenCVLoader takes some time depending upon the phone. So if you load it uisng initDebug(), then it would be executed in the main thread, which may block the UI for a fractional time. So it is advised to load the OpenCV in background which can be achieved using initAsync()