Android 使用 OpenCV (JNI 实现)

版权声明:转载请写明出处,谢谢! 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
  • libs
    • arm64-v8a
    • armeabi
    • armeabi-v7a
    • mips
    • mips64
    • x86
    • x86_64
  • staticlibs
    • arm64-v8a
    • armeabi
    • armeabi-v7a
    • mips
    • mips64
    • x86
    • x86_64

libsstaticlibs 目录内还有其它架构(如:mipsmips64x86x86_64等)。

但 Android 常用 arm 架构,其它可自行考虑。

项目中使用到的 OpenCV 文件

接下来在 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 的方法了。

猜你喜欢

转载自blog.csdn.net/wilson1068/article/details/87656518