本篇文章主要就边框识别部分说一下开发过程及实现原理,通过阅读本篇文章,你将具备以下技能:了解 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 库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${PROJECT_SOURCE_DIR}/opencv/lib/${ANDROID_ABI}/libopencv_imgproc.a)
set_target_properties(opencv_core PROPERTIES IMPORTED_LOCATION${PROJECT_SOURCE_DIR}/opencv/lib/${ANDROID_ABI}/libopencv_core.a)
add_library( smart_cropper
SHARED
src/main/cpp/Scanner.cpp
src/main/cpp/smart_cropper.cpp
src/main/cpp/android_utils.cpp)
find_library( log-lib
log)
find_library(jnigraphics-lib
jnigraphics)
target_link_libraries( smart_cropper
opencv_imgproc
opencv_core
${log-lib}
${jnigraphics-lib})
主要注意点如下:include_directories添加头文件查找路径,包括引入库的和自己写的
add_library添加动态库或静态库,其中本地的动态库名称,位置可以由set_target_properties设置
find_library通过名称查找并引入库,可以引入 NDK 中的库,比如日志模块
target_link_libraries添加参加编译的库名称,也可以是绝对路径&