版权声明:转载请写明出处,谢谢! https://blog.csdn.net/wilson1068/article/details/87656518
Android 使用 OpenCV (JNI 实现)
OpenCV 有提供 Android Jar 库。
可以使用 OpenCV.jar 去在 Android 中实现 OpenCV 的功能。
但是,有个问题:
Android 版本的 OpenCV 和 C++ 版本的接口存在一定的差异。
导致如果你想实现以前 C++ 版本的 OpenCV 功能,那么改动量还是不少的。
因此,如果你想快速在 Android 上使用 C++ 版本已经实现的 OpenCV 功能,那就可以采用以前讲到的 JNI。
下载 OpenCV Android 库
下载方式不介绍了,可以访问 https://opencv.org/releases.html 下载相应的 OpenCV 库。
我使用的是 opencv-3.4.3-android-sdk.zip
解压 OpenCV 压缩档
把压缩文档解压到特定目录,解压后得到:OpenCV-android-sdk
目录
其中我们要用到的文件在 OpenCV-android-sdk/sdk/native
其中更主要的几个目录是:
扫描二维码关注公众号,回复:
5384753 查看本文章
- jni
- include
- opencv
- opencv2
- include
- libs
- arm64-v8a
- armeabi
- armeabi-v7a
- mips
- mips64
- x86
- x86_64
- staticlibs
- arm64-v8a
- armeabi
- armeabi-v7a
- mips
- mips64
- x86
- x86_64
libs
和 staticlibs
目录内还有其它架构(如:mips
,mips64
,x86
,x86_64
等)。
但 Android 常用 arm 架构,其它可自行考虑。
接下来在 Android 工程中建立 CMakeLists.txt,使用 CMake 编译 OpenCV 的 JNI 代码。
CMake 编译 OpenCV JNI
# 请注意,修改本地的 OPENCV_SDK_PATH (OpenCV-android-sdk 路径)
# Sets the minimum version of CMake required to build the native library.
#set(OPENCV_SDK_PATH D:/Code/OpenCV-android-sdk)#设置OpenCv的路径变量
set(OPENCV_SDK_PATH ${CMAKE_SOURCE_DIR}/src/main/cpp/opencv_src)#设置OpenCv的路径变量
# 配置加载native依赖
include_directories(${OPENCV_SDK_PATH}/sdk/native/jni/include
${CMAKE_SOURCE_DIR}/src/main/cpp/
${CMAKE_SOURCE_DIR}/src/main/cpp/include
)
set(CMAKE_VERBOSE_MAKEFILE on)
set(OPENCV_DYNAMIC_LIBS "${OPENCV_SDK_PATH}/sdk/native/libs") # 动态 opencv native 库路径
set(OPENCV_STATIC_LIBS "${OPENCV_SDK_PATH}/sdk/native/staticlibs") # 静态 opencv native 库路径
set(OPENCV_ANDROID_ABI "${ANDROID_ABI}")
link_directories("${OPENCV_DYNAMIC_LIBS}/${OPENCV_ANDROID_ABI}/")
link_directories("${OPENCV_STATIC_LIBS}/${OPENCV_ANDROID_ABI}/")
# 添加库
add_library(libopencv_java3 SHARED IMPORTED )
set_target_properties(libopencv_java3 PROPERTIES
IMPORTED_LOCATION "${OPENCV_DYNAMIC_LIBS}/${OPENCV_ANDROID_ABI}/libopencv_java3.so")
add_library(libopencv_calib3d STATIC IMPORTED )
set_target_properties(libopencv_calib3d PROPERTIES
IMPORTED_LOCATION "${OPENCV_STATIC_LIBS}/${OPENCV_ANDROID_ABI}/libopencv_calib3d.a")
add_library(libopencv_core STATIC IMPORTED )
set_target_properties(libopencv_core PROPERTIES
IMPORTED_LOCATION "${OPENCV_STATIC_LIBS}/${OPENCV_ANDROID_ABI}/libopencv_core.a")
add_library(libopencv_features2d STATIC IMPORTED )
set_target_properties(libopencv_features2d PROPERTIES
IMPORTED_LOCATION "${OPENCV_STATIC_LIBS}/${OPENCV_ANDROID_ABI}/libopencv_features2d.a")
add_library(libopencv_flann STATIC IMPORTED )
set_target_properties(libopencv_flann PROPERTIES
IMPORTED_LOCATION "${OPENCV_STATIC_LIBS}/${OPENCV_ANDROID_ABI}/libopencv_flann.a")
add_library(libopencv_highgui STATIC IMPORTED )
set_target_properties(libopencv_highgui PROPERTIES
IMPORTED_LOCATION "${OPENCV_STATIC_LIBS}/${OPENCV_ANDROID_ABI}/libopencv_highgui.a")
add_library(libopencv_imgcodecs STATIC IMPORTED )
set_target_properties(libopencv_imgcodecs PROPERTIES
IMPORTED_LOCATION "${OPENCV_STATIC_LIBS}/${OPENCV_ANDROID_ABI}/libopencv_imgcodecs.a")
add_library(libopencv_imgproc STATIC IMPORTED )
set_target_properties(libopencv_imgproc PROPERTIES
IMPORTED_LOCATION "${OPENCV_STATIC_LIBS}/${OPENCV_ANDROID_ABI}/libopencv_imgproc.a")
add_library(libopencv_ml STATIC IMPORTED )
set_target_properties(libopencv_ml PROPERTIES
IMPORTED_LOCATION "${OPENCV_STATIC_LIBS}/${OPENCV_ANDROID_ABI}/libopencv_ml.a")
add_library(libopencv_objdetect STATIC IMPORTED )
set_target_properties(libopencv_objdetect PROPERTIES
IMPORTED_LOCATION "${OPENCV_STATIC_LIBS}/${OPENCV_ANDROID_ABI}/libopencv_objdetect.a")
add_library(libopencv_photo STATIC IMPORTED )
set_target_properties(libopencv_photo PROPERTIES
IMPORTED_LOCATION "${OPENCV_STATIC_LIBS}/${OPENCV_ANDROID_ABI}/libopencv_photo.a")
add_library(libopencv_shape STATIC IMPORTED )
set_target_properties(libopencv_shape PROPERTIES
IMPORTED_LOCATION "${OPENCV_STATIC_LIBS}/${OPENCV_ANDROID_ABI}/libopencv_shape.a")
add_library(libopencv_stitching STATIC IMPORTED )
set_target_properties(libopencv_stitching PROPERTIES
IMPORTED_LOCATION "${OPENCV_STATIC_LIBS}/${OPENCV_ANDROID_ABI}/libopencv_stitching.a")
add_library(libopencv_superres STATIC IMPORTED )
set_target_properties(libopencv_superres PROPERTIES
IMPORTED_LOCATION "${OPENCV_STATIC_LIBS}/${OPENCV_ANDROID_ABI}/libopencv_superres.a")
add_library(libopencv_video STATIC IMPORTED )
set_target_properties(libopencv_video PROPERTIES
IMPORTED_LOCATION "${OPENCV_STATIC_LIBS}/${OPENCV_ANDROID_ABI}/libopencv_video.a")
add_library(libopencv_videoio STATIC IMPORTED )
set_target_properties(libopencv_videoio PROPERTIES
IMPORTED_LOCATION "${OPENCV_STATIC_LIBS}/${OPENCV_ANDROID_ABI}/libopencv_videoio.a")
add_library(libopencv_videostab STATIC IMPORTED )
set_target_properties(libopencv_videostab PROPERTIES
IMPORTED_LOCATION "${OPENCV_STATIC_LIBS}/${OPENCV_ANDROID_ABI}/libopencv_videostab.a")
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=gnu++11")
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fexceptions")
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -frtti")
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -DANDROID_STL=gnustl_static")
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -llog") # log
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -lopencv_java3 ")
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -lopencv_calib3d ")
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -lopencv_core ")
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -lopencv_features2d ")
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -lopencv_flann ")
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -lopencv_highgui ")
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -lopencv_imgcodecs ")
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -lopencv_imgproc ")
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -lopencv_ml ")
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -lopencv_objdetect ")
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -lopencv_photo ")
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -lopencv_shape ")
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -lopencv_stitching ")
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -lopencv_superres ")
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -lopencv_video ")
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -lopencv_videoio ")
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -lopencv_videostab ")
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fopenmp ")
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -O2 ")
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fvisibility=hidden ")
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fvisibility-inlines-hidden ")
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fomit-frame-pointer ")
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fstrict-aliasing ")
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -ffunction-sections ")
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fdata-sections ")
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -ffast-math ")
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -lm ")
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -fopenmp ")
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -O2 ")
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -fvisibility=hidden ")
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -fomit-frame-pointer ")
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -fstrict-aliasing ")
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -ffunction-sections ")
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -fdata-sections ")
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -ffast-math ")
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -lm ")
file(GLOB FACE_API_SRC
${CMAKE_SOURCE_DIR}/src/main/cpp/faceapi_opencv.cpp
)
add_library( # Sets the name of the library.
test_facesdk
# Sets the library as a shared library.
SHARED
# Provides a relative path to your source file(s).
${FACE_API_SRC}
)
# Searches for a specified prebuilt library and stores the path as a
# variable. Because CMake includes system libraries in the search path by
# default, you only need to specify the name of the public NDK library
# you want to add. CMake verifies that the library exists before
# completing its build.
find_library( # Sets the name of the path variable.
log-lib
# Specifies the name of the NDK library that
# you want CMake to locate.
log )
# Specifies libraries CMake should link to your target library. You
# can link multiple libraries, such as libraries you define in this
# build script, prebuilt third-party libraries, or system libraries.
target_link_libraries( # Specifies the target library.
test_facesdk
jnigraphics
z
libopencv_java3
libopencv_calib3d
libopencv_core
libopencv_features2d
libopencv_flann
libopencv_highgui
libopencv_imgcodecs
libopencv_imgproc
libopencv_ml
libopencv_objdetect
libopencv_photo
libopencv_shape
libopencv_stitching
libopencv_superres
libopencv_video
libopencv_videoio
libopencv_videostab
# Links the target library to the log library
# included in the NDK.
${log-lib} )
然后你就可以通过 JNI 接口,在 Android 中调用 OpenCV 的方法了。