165

I want to use OpenCV library in my app with Android Studio. I followed instructions found here but I get error

Configuration with name 'default' not found

What can be wrong?

I use Android Studio 1.0 with gradle 2.2.1.

5
  • 1
    Now we could import modules with Android studio and steps could be much simpler. Can you try this stackoverflow.com/a/27356635/1180117 Dec 11, 2014 at 5:08
  • Thank you, it works. Write it as an answer then I can accept it. Dec 11, 2014 at 9:44
  • @BartoszBialecki @Kiran , I've followed it to step No.4 , I can't find the native directory under my sdk directory.Am I missing something? Jan 21, 2015 at 6:01
  • 1
    @RomanticElectron you have to add natvie directory from the sdk of the OpenCV library, not Android sdk. Jan 21, 2015 at 9:01
  • You can find a working Android Studio project with OpenCV including native support (gradle-experimental:0.3.0) here: https://github.com/leadrien/opencv_native_androidstudio
    – leadrien
    Nov 24, 2015 at 13:30

14 Answers 14

332

The below steps for using Android OpenCV sdk in Android Studio. This is a simplified version of this SO answer.

  1. Download latest OpenCV sdk for Android from OpenCV.org and decompress the zip file.
  2. Import OpenCV to Android Studio, From File -> New -> Import Module, choose sdk/java folder in the unzipped opencv archive.
  3. Update build.gradle under imported OpenCV module to update 4 fields to match your project build.gradle a) compileSdkVersion b) buildToolsVersion c) minSdkVersion and d) targetSdkVersion.
  4. Add module dependency by Application -> Module Settings, and select the Dependencies tab. Click + icon at bottom, choose Module Dependency and select the imported OpenCV module.
    • For Android Studio v1.2.2, to access to Module Settings : in the project view, right-click the dependent module -> Open Module Settings
  5. Copy libs folder under sdk/native to Android Studio under app/src/main.
  6. In Android Studio, rename the copied libs directory to jniLibs and we are done.

Step (6) is since Android studio expects native libs in app/src/main/jniLibs instead of older libs folder. For those new to Android OpenCV, don't miss below steps

  • include static{ System.loadLibrary("opencv_java"); } (Note: for OpenCV version 3 at this step you should instead load the library opencv_java3.)
  • For step(5), if you ignore any platform libs like x86, make sure your device/emulator is not on that platform.

OpenCV written is in C/C++. Java wrappers are

  1. Android OpenCV SDK - OpenCV.org maintained Android Java wrapper. I suggest this one.
  2. OpenCV Java - OpenCV.org maintained auto generated desktop Java wrapper.
  3. JavaCV - Popular Java wrapper maintained by independent developer(s). Not Android specific. This library might get out of sync with OpenCV newer versions.
27
  • 2
    Ok I got it, I thought you were talking about the sdk installation directory on my system while you were talking about the directory which comes with Android Open CV SDK.Ok completed step 6. Where do I include static{ System.loadLibrary("opencv_java"); }? Jan 21, 2015 at 9:09
  • 7
    @RomanticElectron where do you include static{ System.loadLibrary("opencv_java"); } ? You say "Thanks I've got it" but there seems to be no message in between. Then you say it's not needed. Could you explain a little more? Thanks.
    – puntofisso
    Aug 18, 2015 at 16:45
  • 9
    for anyone having the android-14 error after importing the module in step 2, you need to manually edit the build.gradle in the openCV directory in your project as shown in step 3.
    – paradite
    Nov 21, 2015 at 16:37
  • 2
    where should the < static{ System.loadLibrary("opencv_java"); } > be included?
    – Libathos
    Dec 7, 2016 at 13:40
  • 3
    I can't understand this step include static{ System.loadLibrary("opencv_java"); } where should I add this?
    – Hasani
    Jan 23, 2018 at 12:28
147

Integrating OpenCV v3.1.0 into Android Studio v1.4.1, instructions with additional detail and this-is-what-you-should-get type screenshots.

Most of the credit goes to Kiran, Kool, 1", and SteveLiles over at opencv.org for their explanations. I'm adding this answer because I believe that Android Studio's interface is now stable enough to work with on this type of integration stuff. Also I have to write these instructions anyway for our project.

Experienced A.S. developers will find some of this pedantic. This answer is targeted at people with limited experience in Android Studio.

  1. Create a new Android Studio project using the project wizard (Menu:/File/New Project):

    • Call it "cvtest1"
    • Form factor: API 19, Android 4.4 (KitKat)
    • Blank Activity named MainActivity

      You should have a cvtest1 directory where this project is stored. (the title bar of Android studio shows you where cvtest1 is when you open the project)

  2. Verify that your app runs correctly. Try changing something like the "Hello World" text to confirm that the build/test cycle is OK for you. (I'm testing with an emulator of an API 19 device).

  3. Download the OpenCV package for Android v3.1.0 and unzip it in some temporary directory somewhere. (Make sure it is the package specifically for Android and not just the OpenCV for Java package.) I'll call this directory "unzip-dir" Below unzip-dir you should have a sdk/native/libs directory with subdirectories that start with things like arm..., mips... and x86... (one for each type of "architecture" Android runs on)

  4. From Android Studio import OpenCV into your project as a module: Menu:/File/New/Import_Module:

    • Source-directory: {unzip-dir}/sdk/java
    • Module name: Android studio automatically fills in this field with openCVLibrary310 (the exact name probably doesn't matter but we'll go with this).
    • Click on next. You get a screen with three checkboxes and questions about jars, libraries and import options. All three should be checked. Click on Finish.

      Android Studio starts to import the module and you are shown an import-summary.txt file that has a list of what was not imported (mostly javadoc files) and other pieces of information. enter image description here

      But you also get an error message saying failed to find target with hash string 'android-14'.... This happens because the build.gradle file in the OpenCV zip file you downloaded says to compile using android API version 14, which by default you don't have with Android Studio v1.4.1. enter image description here

  5. Open the project structure dialogue (Menu:/File/Project_Structure). Select the "app" module, click on the Dependencies tab and add :openCVLibrary310 as a Module Dependency. When you select Add/Module_Dependency it should appear in the list of modules you can add. It will now show up as a dependency but you will get a few more cannot-find-android-14 errors in the event log.

  6. Look in the build.gradle file for your app module. There are multiple build.gradle files in an Android project. The one you want is in the cvtest1/app directory and from the project view it looks like build.gradle (Module: app). Note the values of these four fields:

    • compileSDKVersion (mine says 23)
    • buildToolsVersion (mine says 23.0.2)
    • minSdkVersion (mine says 19)
    • targetSdkVersion (mine says 23)
  7. Your project now has a cvtest1/OpenCVLibrary310 directory but it is not visible from the project view:

enter image description here

Use some other tool, such as any file manager, and go to this directory. You can also switch the project view from Android to Project Files and you can find this directory as shown in this screenshot: enter image description here

Inside there is another build.gradle file (it's highlighted in the above screenshot). Update this file with the four values from step 6.

  1. Resynch your project and then clean/rebuild it. (Menu:/Build/Clean_Project) It should clean and build without errors and you should see many references to :openCVLibrary310 in the 0:Messages screen.

    enter image description here

    At this point the module should appear in the project hierarchy as openCVLibrary310, just like app. (Note that in that little drop-down menu I switched back from Project View to Android View ). You should also see an additional build.gradle file under "Gradle Scripts" but I find the Android Studio interface a little bit glitchy and sometimes it does not do this right away. So try resynching, cleaning, even restarting Android Studio.

    You should see the openCVLibrary310 module with all the OpenCV functions under java like in this screenshot:

    enter image description here

  2. Copy the {unzip-dir}/sdk/native/libs directory (and everything under it) to your Android project, to cvtest1/OpenCVLibrary310/src/main/, and then rename your copy from libs to jniLibs. You should now have a cvtest1/OpenCVLibrary310/src/main/jniLibs directory. Resynch your project and this directory should now appear in the project view under openCVLibrary310.

    enter image description here

  3. Go to the onCreate method of MainActivity.java and append this code:

    if (!OpenCVLoader.initDebug()) {
        Log.e(this.getClass().getSimpleName(), "  OpenCVLoader.initDebug(), not working.");
    } else {
        Log.d(this.getClass().getSimpleName(), "  OpenCVLoader.initDebug(), working.");
    }
    

    Then run your application. You should see lines like this in the Android Monitor: enter image description here (I don't know why that line with the error message is there)

  4. Now try to actually use some openCV code. In the example below I copied a .jpg file to the cache directory of the cvtest1 application on the android emulator. The code below loads this image, runs the canny edge detection algorithm and then writes the results back to a .png file in the same directory.

    Put this code just below the code from the previous step and alter it to match your own files/directories.

    String inputFileName="simm_01";
    String inputExtension = "jpg";
    String inputDir = getCacheDir().getAbsolutePath();  // use the cache directory for i/o
    String outputDir = getCacheDir().getAbsolutePath();
    String outputExtension = "png";
    String inputFilePath = inputDir + File.separator + inputFileName + "." + inputExtension;
    
    
    Log.d (this.getClass().getSimpleName(), "loading " + inputFilePath + "...");
    Mat image = Imgcodecs.imread(inputFilePath);  
    Log.d (this.getClass().getSimpleName(), "width of " + inputFileName + ": " + image.width());
    // if width is 0 then it did not read your image.
    
    
    // for the canny edge detection algorithm, play with these to see different results
    int threshold1 = 70;
    int threshold2 = 100;
    
    Mat im_canny = new Mat();  // you have to initialize output image before giving it to the Canny method
    Imgproc.Canny(image, im_canny, threshold1, threshold2);
    String cannyFilename = outputDir + File.separator + inputFileName + "_canny-" + threshold1 + "-" + threshold2 + "." + outputExtension;
    Log.d (this.getClass().getSimpleName(), "Writing " + cannyFilename);
    Imgcodecs.imwrite(cannyFilename, im_canny);
    
  5. Run your application. Your emulator should create a black and white "edge" image. You can use the Android Device Monitor to retrieve the output or write an activity to show it.

The Gotchas:

  • If you lower your target platform below KitKat some of the OpenCV libraries will no longer function, specifically the classes related to org.opencv.android.Camera2Renderer and other related classes. You can probably get around this by simply removing the apprpriate OpenCV .java files.
  • If you raise your target platform to Lollipop or above my example of loading a file might not work because use of absolute file paths is frowned upon. So you might have to change the example to load a file from the gallery or somewhere else. There are numerous examples floating around.
11
  • 2
    16-Feb edit: jniLibs now in the openCVLibrary310 directory, not the main app directory. Either works but it seems cleaner to me to keep them in the opencv part. Plus more screenshots and the "Gotchas" part.
    – ssimm
    Feb 16, 2016 at 12:33
  • I think some import statements are missing, otherwise very good job! +1 Mar 9, 2016 at 15:20
  • 2
    I followed your answer but failed. 1i got the error OpenCV error: Cannot load info library for OpenCV 2 java.lang.UnsatisfiedLinkError: dalvik.system.PathClassLoader[DexPathList[[zip file "/data/app/www.deven.com.opencv-2/base.apk"],nativeLibraryDirectories=[/vendor/lib, /system/lib]]] couldn't find "libopencv_java3.so What these error about i done step by step as you written. Mar 16, 2016 at 7:04
  • 2
    @DevendraSingh I got the same error as you got but I realised I had missed step 9.
    – aasu
    Apr 13, 2016 at 14:05
  • 2
    what if we want to code in c++ for opencv on android studio?
    – Hasani
    Jan 23, 2018 at 12:51
40

For everyone who felt they want to run away with all the steps and screen shots on the (great!) above answers, this worked for me with android studio 2.2.1:

  1. Create a new project, name it as you want and take the default (minSdkVersion 15 is fine).

  2. Download the zip file from here: https://sourceforge.net/projects/opencvlibrary/files/opencv-android/ (I downloaded 3.2.0 version, but there may be a newer versions).

  3. Unzip the zip file, the best place is in your workspace folder, but it not really matter.

  4. Inside Android Studio, click File->New-> Import Module and navigate to \path_to_your_unzipped_file\OpenCV-android-sdk\sdk\java and hit Ok, then accept all default dialogs.

  5. In the gradle file of your app module, add this to the dependencies block:

     dependencies {
         compile project(':openCVLibraryXYZ')
         //rest of code
     }
    

Where XYZ is the exact version you downloaded, for example in my case:

    dependencies {
        compile project(':openCVLibrary320')
        //rest of code
    }
4
  • 1
    Nice and simple, thnx ;-) Works also for the version 3.2.0.
    – blacharnia
    Mar 22, 2017 at 18:24
  • 3
    Thank you, it's indeed the easier solution. One point from me. The new OpenCV module couldn't be compiled. The answer here helped me to fix this issue stackoverflow.com/a/40302788/408780
    – Tima
    Mar 31, 2017 at 14:58
  • just to add to what @blacharnia said, just make sure you use 'compile project(':openCVLibrary320')' in the cradle dependencies section instead of 310 May 19, 2017 at 0:15
  • @yshahak or can someone help me in this matter, I really need to do this. stackoverflow.com/questions/61876457/… May 18, 2020 at 19:45
14

Android Studio 3.4 + OpenCV 4.1

  1. Download the latest OpenCV zip file from here (current newest version is 4.1.0) and unzip it in your workspace or in another folder.

  2. Create new Android Studio project normally. Click File->New->Import Module, navigate to /path_to_unzipped_files/OpenCV-android-sdk/sdk/java, set Module name as opencv, click Next and uncheck all options in the screen.

  3. Enable Project file view mode (default mode is Android). In the opencv/build.gradle file change apply plugin: 'com.android.application' to apply plugin: 'com.android.library' and replace application ID "org.opencv" with

    minSdkVersion 21
    targetSdkVersion 28
    

    (according the values in app/build.gradle). Sync project with Gradle files.

  4. Add this string to the dependencies block in the app/build.gradle file

    dependencies {
        ...
        implementation project(path: ':opencv')
        ...
    }
    
  5. Select again Android file view mode. Right click on app module and goto New->Folder->JNI Folder. Select change folder location and set src/main/jniLibs/.

  6. Select again Project file view mode and copy all folders from /path_to_unzipped_files/OpenCV-android-sdk/sdk/native/libs to app/src/main/jniLibs.

  7. Again in Android file view mode right click on app module and choose Link C++ Project with Gradle. Select Build System ndk-build and path to OpenCV.mk file /path_to_unzipped_files/OpenCV-android-sdk/sdk/native/jni/OpenCV.mk.

    path_to_unzipped_files must not contain any spaces, or you will get error!

To check OpenCV initialization add Toast message in MainActivity onCreate() method:

Toast.makeText(MainActivity.this, String.valueOf(OpenCVLoader.initDebug()), Toast.LENGTH_LONG).show();

If initialization is successful you will see true in Toast message else you will see false.

3
  • Above you say " replace application ID "org.opencv" with ....." but there is nothing following the "with". Can you please clarify? Do you mean to say "remove the applicationId entry and add two entries as follows:"
    – Dale
    Sep 19, 2019 at 18:51
  • @Dale Yes, you should replace application ID "org.opencv" string with two strings: minSdkVersion 21 and targetSdkVersion 28 (according the values in app/build.gradle file)
    – Plo_Koon
    Sep 20, 2019 at 19:51
  • I followed all the steps as you described . But getting error E/art: dlopen("/data/app/com.example.objectsegmentation-1/lib/arm64/libopencv_java4.so", RTLD_LAZY) failed: dlopen failed: library "libc++_shared.so" not found
    – Masthan
    Jan 7, 2020 at 6:40
5

In your build.gradle

repositories {
  jcenter()
}

implementation 'com.quickbirdstudios:opencv:4.1.0'

More information

1
  • How can we use it in C++?
    – Shoaib
    Jun 7, 2022 at 9:03
3
Download

Get the latest pre-built OpenCV for Android release from https://github.com/opencv/opencv/releases and unpack it (for example, opencv-4.4.0-android-sdk.zip).

Create an empty Android Studio project

Open Android Studio. Start a new project. 

enter image description here

Keep default target settings.

Use "Empty Activity" template. Name activity as MainActivity with a corresponding layout activity_main. Plug in your device and run the project. It should be installed and launched successfully before we'll go next.

 Add OpenCV dependency

Go to File->New->Import module

and provide a path to unpacked_OpenCV_package/sdk/java. The name of module detects automatically. Disable all features that Android Studio will suggest you on the next window.

enter image description here

enter image description here

Configure your library build.gradle (openCVLibrary build.gradle)

apply plugin: 'com.android.library'

android {
    compileSdkVersion 28
    buildToolsVersion "28.0.3"

    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.txt'
        }
    }
}

Implement the library to the project (application build.gradle)

 implementation project(':openCVLibrary330')
2

This worked for me and was as easy as adding a gradle dependancy:

https://bintray.com/seesaa/maven/opencv#

https://github.com/seesaa/opencv-android

The one caveat being that I had to use a hardware debugging device as arm emulators were running too slow for me (as AVD Manager says they will), and, as described at the repo README, this version does not include x86 or x86_64 support.

It seems to build and the suggested test:

static {
    OpenCVLoader.initDebug();
}

spits out a bunch of output that looks about right to me.

1
  • This was from a fresh project in android studio. I did not import anything, did not download anything, etc. Just add the gradle dependency and sync. Dec 27, 2018 at 16:23
2

On the latest openCV version 4.5.2, you need to import the whole sdk folder, not sdk/java, other wise when you go to add the dependency, OpenCV doesn't show up. full description here:

Cant add openCV module as a dependency to my app

1

It took me a long time to figure out how it works. The method I used does not require Gradle.

Disclaimer: I do not know how good or bad this method is. So use it on your own.

  1. Download Both "OpenCV4Android" and "AndroidNDK" (Download NDK to found libc++_shared.so as I say later)
  2. Extract "OpenCV4Android" somewhere and import one of the examples like this one "opencv-4.5.1-android-sdk\OpenCV-android-sdk\samples\tutorial-1-camerapreview" to android studio.
  3. After importing, go to "OpenCV4Android" sdk again "OpenCV-android-sdk\sdk\java\src\org\opencv" and copy this folder with all subfolders to your "tutorial-1-camerapreview" sample project like section (1) of this image:

enter image description here

  1. Now you need JNI Libraries and also libc++_shared.so. Make a folder in your sample project and name it "Libs"(this name is not important but you have to configure it later). Go to "OpenCV4Android" sdk again and copy all folders of "opencv-4.5.1-android-sdk\OpenCV-android-sdk\sdk\native\libs" to your new "libs" folder in your sample project as section (2) of above picture. Also extract ndk and go to this address "android-ndk\android-ndk-r20b\sources\cxx-stl\llvm-libc++\libs" and copy libc++_shared.so to your libs directory.

Note that for both libraries you must place at least four files with the same name but in folders for different CPU architectures.

  1. Important part. You must load these libs somewhere. I put them in Activity. Check section (3) of above image.
    static {
            System.loadLibrary("opencv_java4");
    }
  1. For last step open "Project Structure" and define your Libs folder like this image:

enter image description here

And for last TIP make an APK directly if you don't want to emulate your application.

enter image description here

1

I was able to install opencv 3.4.15 on Android studio Arctic Fox with just 3 steps:

  • step 0: create a new empty project
  • step 1: Download opencv-3.4.15 from the official release page. Extract it to your place of choice
  • step 2: Add the following 3 lines to the bottom of your settings.gradle
def opencvsdk='/path/to/opencv-3.4.1-android-sdk/OpenCV-android-sdk'
include ':opencv'
project(':opencv').projectDir = new File(opencvsdk + '/sdk')

Hit Sync Now

  • step 3: Add the below 2 lines to your app/build.gradle dependencies
    implementation fileTree(dir: 'libs', include: ['*.jar'])
    implementation project(':opencv')

Hit Sync Now

Done !!!

Verification:

Add the below lines to your MainActivity.java

static {
    String TAG = "MainActivity";
    if (OpenCVLoader.initDebug()){
        Log.i(TAG, "opencv installed successfully");
    }else{
        Log.i(TAG, "opencv not installed");
    }
}

Source:

After you have extracted the zip file, go to the location below:

opencv-3.4.1-android-sdk/OpenCV-android-sdk/sdk and open build.gradle file with any text viewer. There if you scroll down you will find something similar to the screenshot below

opencv-android-installation

1

In the latest OpenCV releases you need to import the whole sdk folder.

Actually, it is pretty easy to import OpenCV by just following the official guide from its build.gradle file. Here is a slightly edited version:

  1. Add the following to settings.gradle (sdk directory of OpenCV should be a subdirectory of the specified path):
def opencvsdk='<path_to_opencv_android_sdk_rootdir>'
include ':opencv'
project(':opencv').projectDir = new File(opencvsdk + '/sdk')
  1. Add dependency into app/build.gradle:
dependencies {
    ...
    implementation project(':opencv')
}
  1. Load OpenCV native library: use System.loadLibrary("opencv_java4") (the actual name depends on your OpenCV version) or OpenCVLoader.initDebug()
  2. (Optional) For native C++ support (necessary to use OpenCV in native code of application):
  • In app/CMakeLists.txt:
find_package(OpenCV <your-opencv-version> REQUIRED java)
...
target_link_libraries(<your-native-lib-name> ${OpenCV_LIBRARIES})
  • In app/build.gradle:
defaultConfig {
       ...
       externalNativeBuild {
           cmake {
               cppFlags "-std=c++11 -frtti -fexceptions"
               arguments "-DOpenCV_DIR=" + opencvsdk + "/sdk/native/jni",
                       "-DANDROID_ARM_NEON=TRUE"
           }
       }
   }
1

I am bit late. But I was also unable to load the latest version (v:4.5.5) of opencv sdk in android studio, because everyone was saying that File-> New-> Import Module-> then go to opencv-4.5.5-android-sdk\OpenCV-android-sdk\sdk\java folder, but when I imported, it seems to be nothing in my imported opencv module so after a long research I was able to find solution so here I have shared.

  1. Download Opencv sdk from official website: Go to : https://opencv.org/releases/, Click on Android. I have downloaded 4.5.5 version.
  2. In your project click on File > New > Import Module... and select the opencv-4.5.5-android-sdk/OpenCV-android-sdk/sdk directory inside your OpenCV download. Rename to opencv_v455 or if you want to leave it (up to you) and wait for the Gradle to finish. The directory you selected should have been copied in the root of your project where the default /app directory exists.
  3. Open the Project Structure by clicking on File > Project Structure, then go to Dependencies (on the left), click on app and on the + icon in the Declared Dependencies tab (not the one in the Modules tab).
  4. Now click on Module Dependency and select the checkbox for the OpenCV SDK that you imported earlier. You should now see it in the list with the other dependencies, so click on Apply and OK to exit from the Project Structure;
  5. Open the build.gradle file of your app module, copy the values of compileSdkVersion, minSdkVersion and targetSdkVersion, then paste them in the build.gradle file of the OpenCV module replacing the default ones so they match exactly. You can also update the sourceCompatibility and targetCompatibility fields to JavaVersion.VERSION_1_8 in compileoptions tag in app module.
  6. Now click on Sync Now and wait for gradle to finish.

If you want to check that you have successfully added opencv. you can write below code in MainActivity.kt or MainActivity.java.

if (OpenCVLoader.initDebug()) {
    Log.d("myTag", "OpenCV loaded")
}

Cheers!!

0

Anybody facing problemn while creating jniLibs cpp is shown ..just add ndk ..

0

Just add jcenter() to repositories in build gradle

repositories {
            jcenter()
             google()
             mavenCentral()
            }

then add this implementation

implementation 'com.quickbirdstudios:opencv:4.1.0'

Not the answer you're looking for? Browse other questions tagged or ask your own question.