OpenCV in Android Studio
Solution 1
The below steps for using Android OpenCV sdk in Android Studio. This is a simplified version of this(1) SO answer.
- Download latest OpenCV sdk for Android from OpenCV.org and decompress the zip file.
- Import OpenCV to Android Studio, From File -> New -> Import Module, choose sdk/java folder in the unzipped opencv archive.
- 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.
-
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
- Copy libs folder under sdk/native to Android Studio under app/src/main.
- 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 libraryopencv_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
- Android OpenCV SDK - OpenCV.org maintained Android Java wrapper. I suggest this one.
- OpenCV Java - OpenCV.org maintained auto generated desktop Java wrapper.
- JavaCV - Popular Java wrapper maintained by independent developer(s). Not Android specific. This library might get out of sync with OpenCV newer versions.
Solution 2
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.
-
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)
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).
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)
-
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.
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.
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.
-
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)
Your project now has a cvtest1/OpenCVLibrary310 directory but it is not visible from the project view:
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:
Inside there is another build.gradle file (it's highlighted in the above screenshot). Update this file with the four values from step 6.
-
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.
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:
-
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.
-
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:
(I don't know why that line with the error message is there)
-
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);
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.
Solution 3
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
:
-
Create a new project, name it as you want and take the default (minSdkVersion 15 is fine).
-
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).
-
Unzip the zip file, the best place is in your workspace folder, but it not really matter.
-
Inside
Android Studio
, clickFile->New-> Import Module
and navigate to\path_to_your_unzipped_file\OpenCV-android-sdk\sdk\java
and hit Ok, then accept all default dialogs. -
In the
gradle
file of yourapp
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
}
Solution 4
Android Studio 3.4 + OpenCV 4.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.
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 asopencv
, clickNext
and uncheck all options in the screen.-
Enable
Project
file view mode (default mode isAndroid
). In theopencv/build.gradle
file changeapply plugin: 'com.android.application'
toapply plugin: 'com.android.library'
and replaceapplication ID "org.opencv"
withminSdkVersion 21 targetSdkVersion 28
(according the values in
app/build.gradle
). Sync project with Gradle files. -
Add this string to the dependencies block in the
app/build.gradle
filedependencies { ... implementation project(path: ':opencv') ... }
Select again
Android
file view mode. Right click onapp
module and gotoNew->Folder->JNI Folder
. Select change folder location and setsrc/main/jniLibs/
.Select again
Project
file view mode and copy all folders from/path_to_unzipped_files/OpenCV-android-sdk/sdk/native/libs
toapp/src/main/jniLibs
.-
Again in
Android
file view mode right click onapp
module and chooseLink C++ Project with Gradle
. Select Build Systemndk-build
and path toOpenCV.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
.
Solution 5
In your build.gradle
repositories {
jcenter()
}
implementation 'com.quickbirdstudios:opencv:4.1.0'
Related videos on Youtube
Bartosz Bialecki
Updated on March 12, 2022Comments
-
Bartosz Bialecki over 2 years
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.
-
kiranpradeep over 9 yearsNow we could import modules with Android studio and steps could be much simpler. Can you try this stackoverflow.com/a/27356635/1180117
-
Bartosz Bialecki over 9 yearsThank you, it works. Write it as an answer then I can accept it.
-
Romantic Electron over 9 years@BartoszBialecki @Kiran , I've followed it to step No.4 , I can't find the
native
directory under mysdk
directory.Am I missing something? -
Bartosz Bialecki over 9 years@RomanticElectron you have to add natvie directory from the sdk of the OpenCV library, not Android sdk.
-
Romantic Electron over 9 years@BartoszBialecki thanks
-
leadrien over 8 yearsYou 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
-
-
Romantic Electron over 9 yearsI am getting errors following the second step, Shall I delete the
javadocs
directory ?.It's also asking me for installingandroid sdk 14
though I am targetting devices that supportandroid sdk 15
-
kiranpradeep over 9 years@RomanticElectron Hope you have downloaded OpenCV4Android 2.4.10 from link sourceforge.net/projects/opencvlibrary/files/opencv-android/… and not that java desktop version ?
-
Romantic Electron over 9 yearsI am using
OpenCV4Android 2.4.9
, I have completed step 4 but I am unable to find thesdk/native
directory in mysdk
directory.Am I missing something? -
kiranpradeep over 9 years@RomanticElectron I just re-downloaded that file and rechecked.
native
folder is present. Not sure why it is missing for you. -
Romantic Electron over 9 yearsOk 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 withAndroid Open CV SDK
.Ok completed step 6. Where do I includestatic{ System.loadLibrary("opencv_java"); }
? -
Ashok Varma over 9 years@RomanticElectron where did you add include static{ System.loadLibrary("opencv_java"); } ??? In the activity ??
-
Romantic Electron over 9 years@AshokVarma No I didn't , it's not required
-
Ashok Varma over 9 years@RomanticElectron i done the process and i was able to import OpenCV. but i tried opencv.android.utils.matToBitmap it failed. Should i need to setup NDK also ??
-
puntofisso almost 9 years@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.
-
Romantic Electron almost 9 years@puntofisso It should be working fine without it ? Isn't it ? It was required in older versions perhaps , the newer work fine without it.
-
ZZ 5 over 8 yearsI've followed your instructions and when I've done third step I've tried to do fourth step, but I couldn't do anything on my module 'android' (It's sample ZXing app). So I've restarted Android Studio and instead of module 'android' there was openCV module, which is even more confusing. The old module is gone and I don't know what to do.
-
paradite over 8 yearsfor anyone having the
android-14
error after importing the module in step 2, you need to manually edit thebuild.gradle
in the openCV directory in your project as shown in step 3. -
ssimm over 8 years16-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.
-
Allan Nørgaard over 8 yearsI think some import statements are missing, otherwise very good job! +1
-
ssimm over 8 yearsI don't mind revising it. Please tell me what to add.
-
Devendra Singh over 8 yearsI followed your answer but failed. 1i got the error
OpenCV error: Cannot load info library for OpenCV
2java.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. -
Somir Saikia over 8 yearsIf you still have problem watch this video link
-
aasu about 8 years@DevendraSingh I got the same error as you got but I realised I had missed step 9.
-
Dale almost 8 yearsThis answer might be a good addition to the "Documentation Beta". I looked at the opencv topic, but I couldn't tell how or what to do there. Seems to me we need separate topics: opencv general, opencv android, etc.
-
Muhammad Babar over 7 yearswhy do we write
System.loadLibrary("opencv_java3")
while the .so file is named libopencv_java3? -
Majid Hojati over 7 yearsGreat answer.Specially by adding liberaries into app. Only missing thing is about adding android camera permission
-
Libathos over 7 yearswhere should the < static{ System.loadLibrary("opencv_java"); } > be included?
-
Jose Gómez over 7 yearsThis works great. Note that if you are only planning to support certain architectures, you can copy only the libraries for them. In case a user with a different architecture tries to run the app, I think (not yet tested) the app will ask to install the OpenCV manager.
-
Jose Gómez over 7 yearsThe only problem, though, is that your repository will grow with more than 1000 OpenCV files. It'd be great if we could just add a jar or something, instead of all the separate files.
-
blacharnia over 7 yearsNice and simple, thnx ;-) Works also for the version 3.2.0.
-
Sudarshan over 7 yearsSome links are broken. Please fixed broken the links. (This may help other users)
-
Tima about 7 yearsThank 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
-
ahasbini about 7 yearsAlthough this method packages the jni libs into the APK, it does not help for native C/C++ coding as a
externalNativeBuild
orndk
block is not found inbuild.gradle
file. Recent updates in Android Studio 2.3.0 has received that kind of integration. Please check my answer for more information: stackoverflow.com/a/43886764/2949966 -
ahasbini about 7 yearsAlthough this method packages the jni libs into the APK, it does not help for native C/C++ coding as a
externalNativeBuild
orndk
block is not found inbuild.gradle
file. Recent updates in Android Studio 2.3.0 has received that kind of integration. Please check my answer for more information: stackoverflow.com/a/43886764/2949966 -
Abraham Philip about 7 yearsjust to add to what @blacharnia said, just make sure you use 'compile project(':openCVLibrary320')' in the cradle dependencies section instead of 310
-
Ziarno almost 7 yearsnote at step 5: copy the
sdk/native/libs
folder, not thesdk/native
folder (the phrasing in the answer makes this easy to overlook) -
Pranav Nandan over 6 yearsAnyone able to fix the "cannot load info" error? I know the library loads anyway!
-
Mick over 6 yearsMaybe more generally, to add to the above comments, use "compile project(':openCVLibraryXYZ')" where XYZ is the version number of openCV Android SDK without the 'dots' - this also works now for version 3.4.0 -> i.e. use "compile project(':openCVLibrary340')"
-
yshahak over 6 years@Mick thanks, I edited the answer according to your suggestion.
-
user8663682 over 6 yearsIf I want to write C++ code for OpenCV on Android Studio, should I do the steps you wrote above?
-
user8663682 over 6 yearsI can't understand this step
include static{ System.loadLibrary("opencv_java"); }
where should I add this? -
user8663682 over 6 yearsAlso in this step
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) targetSdkVersio
there is no numbers to change. I use android studio v2.3 and only have this line with numbers ` classpath 'com.android.tools.build:gradle:2.3.0' ` -
user8663682 over 6 yearswhat if we want to code in c++ for opencv on android studio?
-
Jose Jithin Stanly over 6 yearsI think, Step#5 need be done under openCV module, not our "app" module.
-
VP4Android about 6 yearsgreat post.!Thank you.
-
Naumdev over 5 yearsThis 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.
-
Dale almost 5 yearsAbove 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:"
-
Plo_Koon almost 5 years@Dale Yes, you should replace
application ID "org.opencv"
string with two strings:minSdkVersion 21
andtargetSdkVersion 28
(according the values in app/build.gradle file) -
Masthan over 4 yearsI 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
-
Carlos Diego about 4 years@ahasbini i'm really in need of help with this question, can you help me, please? stackoverflow.com/questions/61216402/…
-
Carlos Diego about 4 years@ssimm i'm really in need of help with this question, can you help me, please? stackoverflow.com/questions/61216402/…
-
Tecnologia da Net about 4 years@yshahak or can someone help me in this matter, I really need to do this. stackoverflow.com/questions/61876457/…
-
Tecnologia da Net about 4 years@Kiran or can someone help me in this matter, I really need to do this. stackoverflow.com/questions/61876457/…
-
Mayur Satav almost 4 yearswhile importing
/OpenCV-android-sdk/sdk/java
android studio not showing module name text box for edit, result module name import asjava
. After that in dependencies there no java module showing, even after successfully importing the module