本篇文章主要就边框识别部分说一下开发过程及实现原理,通过阅读本篇文章,你将具备以下技能:
了解 NDK 开发的基本步骤,能使用 Java、C++/C 混合开发简单的应用
了解 OpenCV 库的作用及其用法,能使用 OpenCV 做图像处理
了解基于 OpenCV 的边框识别实现
OpenCV 的全称是 Open Source Computer Vision Library,是一个使用 C++ 编写的跨平台的计算机视觉库,能对输入的图片进行处理,包括常见的高斯模糊,提取灰度图片,提取轮廓等等,可以应用于增强现实,人脸识别,运动跟踪,物体识别,图像分区等。
在 Android 平台需要使用 JNI 技术来调用 C++ 的库,事实上,OpenCV 的官网已经提供了编写好的 Android 库:OpenCv4Android,我们可以按照提示导入该库,就可用以使用 Java 代码来调用了。但是该库包含了 OpenCV 所有的模块,造成了该库体积非常大,其中很多并不是我们需要的。所以我的做法是只使用该库提供的编译好的 C++ 库,挑选自己需要用到的模块,引入其动态或者静态库,编写 C++ 代码调用 OpenCV 的这些模块完成主要功能,最后使用 JNI 技术编写 Java 接口供 Android 程序调用。
导入 OpenCV 库
下载好 OpenCv4Android 后解压目录如下所示:
OpenCV-2.4.13-android-sdk
|_ doc
|_ samples
|_ sdk
| |_ etc
| |_ java
| |_ native
| |_ 3rdparty
| |_ jni
| |_ libs
| |_ armeabi
| |_ armeabi-v7a
| |_ x86
|
|_ LICENSE
|_ README.android
sdk/java 目录提供了 OpenCv 的 Java API,导入到项目中,并且将 native/libs 下面的 native 库导入之后就可以使用 OpenCV 的 Java API 了。native/jni 目录下提供了编译用的 cmake 文件以及头文件。
在 SmartCropper 中只使用到了 opencv_core 与 opencv_imgproc 模块, 所以只需要导入这两个模块的头文件与动态库/静态库就行了。
目录如下所示:
smartcropperlib
├── opencv
│ ├── include
│ │ └── opencv2
│ │ ├── core
│ │ ├── imgproc
│ │ ├── opencv.hpp
│ │ └── opencv_modules.hpp
│ └── lib
│ ├── armeabi
│ │ ├── libopencv_core.a
│ │ └── libopencv_imgproc.a
│ ├── armeabi-v7a
│ ├── mips
│ └── x86
├── CMakeLists.txt
└── build.gradle
└── src
└── main
├── cpp
│ ├── Scanner.cpp
│ ├── android_utils.cpp
│ ├── include
│ │ ├── Scanner.h
│ │ └── android_utils.h
│ └── smart_cropper.cpp
├── java
└── res
编写 cmake 文件:
include_directories(opencv/include
src/main/cpp/include)
add_library(opencv_imgproc STATIC IMPORTED)
add_library(opencv_core STATIC IMPORTED)
set_target_properties(opencv_imgproc PROPERTIES IMPORTED_LOCATION P R O J E C T S O U R C E D I R / o p e n c v / l i b / {PROJECT_SOURCE_DIR}/opencv/lib/ PROJECTSOURC