Bootstrap

【Android】jni开发之导入opencv和libyuv来进行图像处理

做视频图像处理时需要对其进行水印的添加,放在应用层调用工具性能方面不太满意,于是当下采用opencv+libyuv方法进行处理。

对于Android的jni开发不是很懂,我的需求是导入opencv方便在cpp中调用,但目前找到的教程都是把opencv作为模块进行导入,在java层查看。

摸索了一段时间终于搞完了!

1.下载对应的openCV包(我目前版本为4.10.0)

opencv下载
在这里插入图片描述
解压得到:
在这里插入图片描述

2.AS中进行配置

2.1.把opencv的include文件夹复制到cpp目录下

在这里插入图片描述

2.2.把opencv的libs放置到与cpp目录同级的的jniLibs目录下

按需选择,我项目只需要前两个
在这里插入图片描述
项目结构如下:
在这里插入图片描述

3.对build.gradle(:模块名)内容进行修改

android {
  defaultConfig {
    externalNativeBuild {
      cmake {
        cppFlags ''
        arguments "-DANDROID_STL=c++_shared"
      }
    }
    ndk {
      abiFilters 'arm64-v8a','armeabi-v7a'
    }
  }

  externalNativeBuild {
    cmake {
      path file('src/main/cpp/CMakeLists.txt')
      version '3.22.1'
    }
  }
  sourceSets {
    main {
      jniLibs.srcDirs = ['src/main/jniLibs'] //指定库的位置
    }
  }
}

4.对CMakeLists.txt进行修改

# 设置 OpenCV 的头文件路径
include_directories(${CMAKE_SOURCE_DIR}/cpp/include)

# 设置库的路径  采用文件的绝对路径  libyuv和opencv在同一层
set(OpenCV_LIBS_DIR "E:/AndroidProject/Demo/app/src/main/jniLibs/${ANDROID_ABI}")

# 导入 OpenCV 的共享库
add_library(opencv_java4 SHARED IMPORTED)
set_target_properties(opencv_java4 PROPERTIES IMPORTED_LOCATION
        ${OpenCV_LIBS_DIR}/libopencv_java4.so

# 设置头文件
target_include_directories(${CMAKE_PROJECT_NAME} PRIVATE ${CMAKE_SOURCE_DIR}/include)

target_link_libraries(${CMAKE_PROJECT_NAME}
    android
    opencv_java4 #链接声明
    log)

测试cpp中是否可用opencv
导入头文件即可:#include “opencv2/opencv.hpp”
没有报错即可正常使用,如果提示找不到opencv.hpp,则查看CMakeLists.txt中的路径是否正确

libyuv导入同理,用的现成编译好的so库和头文件
libyuv
下载解压后得到:
在这里插入图片描述
头文件在jni/include,库在libs

最后,完整的CMakeLists.txt如下

cmake_minimum_required(VERSION 3.22.1)

project("dvr")

set(CMAKE_CXX_STANDARD 11)
set(CMAKE_CXX_STANDARD_REQUIRED True)
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11")

# 设置 OpenCV 的头文件路径
include_directories(${CMAKE_SOURCE_DIR}/cpp/include)
# 导入 OpenCV 的共享库
set(OpenCV_LIBS_DIR "E:/AndroidProject/Demo/app/src/main/jniLibs/${ANDROID_ABI}")
add_library(opencv_java4 SHARED IMPORTED)
set_target_properties(opencv_java4 PROPERTIES IMPORTED_LOCATION
        ${OpenCV_LIBS_DIR}/libopencv_java4.so)

# libyuv
add_library(yuv SHARED IMPORTED)
set_target_properties(yuv PROPERTIES IMPORTED_LOCATION
        ${OpenCV_LIBS_DIR}/libyuv.so)

add_library(${CMAKE_PROJECT_NAME} SHARED
    dvr.cpp)

target_include_directories(${CMAKE_PROJECT_NAME} PRIVATE ${CMAKE_SOURCE_DIR}/include)
target_link_libraries(${CMAKE_PROJECT_NAME}
    android
        opencv_java4
        yuv
    log)

图像处理什么的,opencv这些都导入成功了,自然也就简单了

;