Android 使用 OpenCV (JNI 实现)
16lz
2021-01-23
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
其中更主要的几个目录是:
- 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") # logset(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 的方法了。
更多相关文章
- Android SDK版本问题: conversion to dalvik format failed with
- android项目目录结构
- Android内核开发:源码的版本与分支详解
- Android发展以及历史版本号
- RatingBar 显示正常版本----断点记录
- Android提示版本更新的实现