本文翻译自OpenCV in Android Studio - stackoverflow[1]的第二个回答,略有删减。
本文档内容在如下环境下测试通过:
- Android Studio 1.5.1
- Opencv for Android 3.1.0
详细步骤
注:以“*”开头的步骤为关键步骤
1. 创建新项目
使用向导创建一个新项目(Menu:/File/New Project)。
- 项目命名为"cvtest1"
- Form factor:API 19, Android 4.4(KitKat)
- Blank Activity named MainActivity
2. 编译运行
这时候可以试试运行新建的项目(Menu:/Run/Run 'app')。可以试试修改文件app/res/layout/content_main.xml
,修改一下字符串“Hello world!”,然后看看运行效果。
3. 下载OpenCV for Android
从opencv网站下载OpenCV for Android,解压到本地目录,例如/opt/OpenCV-android-sdk
。
确定sdk/native/libs
目录下有arm...,mips...和等开头的子目录,这些是针对不同平台的编译好的库文件。稍后我们需要把libs
目录复制到项目中。
4. *在项目中导入OpenCV
把OpenCV导入到项目中(Menu:/File/New/import_Module):
- Source-directory:
{unzip-dir}/adk/java
- Module name: Android Studio能自动填充这个信息
openCVLibrary310
,这个我们不用修改,默认就行 - 点击“next”,接下来有3个复选框,我们需要全部选中,点击“Finish”
接下来,Android Studio开始导入module,完成后,能够看到import-summary.txt
,如下图:
同时,你还会看到一个错误信息,说找不到android-14
,这是因为我们下载的OpenCV中的build.gradle
里配置的是用android API version 14编译,默认情况下,我们的Android SDK里已经不包含android-14
这个版本了。后面我们需要解决这个错误。
5. *设置Module依赖
因为我们的app
里要使用opencv
库里提供的方法,我们需要在app的依赖里增加刚导入进来的opencv module
。
- 打开project structure(Menu:/File/Project_Structure)
- 选择“app”module
- 切换到
Dependencies
tab页 - 点“+”,选择Module,能看到
openCVLibrary310
,选择之
6. 查看app build.gradle
项目中有很多个build.gradle
文件,我们要看app的build.gradle
文件,这个文件在目录cvtest1/app
下面,在project视图里是这样的build.gradle(Module:app)
,重点看如下内容:
- compileSDKVersion (mine says 23)
- buildToolsVersion (mine says 23.0.2)
- minSdkVersion (mine says 19)
- targetSdkVersion (mine says 23)
7. *修改OpenCV build.gradle
我们需要按照上面的内容来修改OpenCV的build.gradle
,默认情况下,在project view
下看不到新导入的openCVLibrary310
,如下图:
这时,我们可以切换左上角的
Android
视图到
Project Files
视图,如下图:
上图光标选中的
build.gradle
文件就是我们要修改的文件。
8. Rebuild Project
rebuild项目(Menu:/Build/Rebuild Project),这时应该没有错误信息了,如下图:
这时在
project view
的
Android
视图里,可以看到
openCVLibrary310
这个Module了,如下图:
9. *复制OpenCV Native lib到项目
复制{unzip-dir}/sdk/native/libs
到项目cvtest1/openCVLibrary/src/main/
目录下,重命名为jniLibs
,如图所示:
10. 修改代码,加载OpenCV so
修改文件MainActivity.java
,在函数onCreate
最后增加如下代码,加载OpenCV动态链接库。
if (!OpenCVLoader.initDebug()) {
Log.e(this.getClass().getSimpleName(), " OpenCVLoader.initDebug(), not working.");
} else {
Log.d(this.getClass().getSimpleName(), " OpenCVLoader.initDebug(), working.");
}
运行一下,在Android Monitor
里能够看到如下log:
11. 调用OpenCV方法
接下来我们就可以调用opencv的方法了。我们打开一个图片,然后使用opencv的canny方法进行边缘检测。
代码如下:
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);
我们可以把处理过的图片在程序中显示出来[2],打开app/res/layout/content_main.xml
,添加一个imageView
到主画面里(通过鼠标拖拽就能实现),记住新增控件的
id,例如
imageView`。再增加如下代码:
// convert to bitmap:
Bitmap bm = Bitmap.createBitmap(im_canny.cols(), im_canny.rows(),Bitmap.Config.ARGB_8888);
Utils.matToBitmap(im_canny, bm);
// find the imageview and draw it!
ImageView iv = (ImageView) findViewById(R.id.imageView);
iv.setImageBitmap(bm);
运行一下程序,就能够看到处理后的图片了。
参考文档
- OpenCV in Android Studio - stackoverflow
- Display image? - opencv.org