目录
一、Opencv的ubuntu编译
二、onnxruntime的ubuntu编译
三、在Ubuntu上编译写好的步伐
四、交叉编译安卓版本Opencv
五、交叉编译安卓版本onnxruntime
六、工程CMakeLists.txt
参考链接
一、Opencv的ubuntu编译
参考:Ubuntu18.04安装Opencv4.5(最新最详细)_ubuntu安装opencv4.5-CSDN博客
起首下载Opencv源代码:Releases - OpenCV,我这里下载的是4.5.4版本,在ubuntu体系中解压。
安装环境依赖:
- sudo apt-get install build-essential
- sudo apt-get install cmake git libgtk2.0-dev pkg-config libavcodec-dev libavformat-dev libswscale-dev
复制代码 创建build文件夹并进入,然后cmake编译:
- mkdir build
- cd ./build
- cmake -D CMAKE_INSTALL_PREFIX=/usr/local -D CMAKE_BUILD_TYPE=Release -D OPENCV_GENERATE_PKGCONFIG=ON -D OPENCV_ENABLE_NONFREE=True ..
复制代码 cmake结束之后举行make编译然后安装:
- make -j8 # 建议ubuntu线程多的可以分配多一点,编译要很久
- sudo make install
复制代码 二、onnxruntime的ubuntu编译
起首在GitHub中下载源码,这里我下载的是1.18.0版本Release ONNX Runtime v1.18.0 · microsoft/onnxruntime · GitHub
查抄有没有安装依赖项,先安装build-essential:
- sudo apt-get install build-essential
复制代码 然后解压代码进入到目录中举行编译:
- cd onnxruntime-1.18.0/
- ./build.sh --config Release --build_shared_lib --parallel #进行编译
复制代码 一般来说都可以正常编译,但不知道为什么我会出现这种错误:
然后我初始化git再举行编译,然后安装。
- git init
- ./build.sh --config Release --build_shared_lib --parallel
- sudo make install
复制代码 三、在Ubuntu上编译写好的步伐
编译好本地的Opencv和onnxruntime后,我们得先编译本地的步伐测试是否能够正常运行,否则反面交叉编译堕落也不知道问题在哪,起首写好CMakeLists.txt文件生存。
- cmake_minimum_required(VERSION 3.10)
- project(InferenceDecoder)
- # 设置 C++ 标准
- set(CMAKE_CXX_STANDARD 17)
- set(CMAKE_CXX_STANDARD_REQUIRED True)
- # 查找 OpenCV 库
- find_package(OpenCV REQUIRED)
- # 设置 ONNX Runtime 的路径
- set(ONNX_RUNTIME_DIR /home/liao/onnxruntime-1.18.0)
- # 添加 ONNX Runtime 包含目录
- include_directories(${ONNX_RUNTIME_DIR}/include)
- include_directories(${ONNX_RUNTIME_DIR}/include/onnxruntime/core/session)
- # 添加 ONNX Runtime 库目录
- link_directories(${ONNX_RUNTIME_DIR}/lib)
- # 添加头文件目录
- include_directories(${CMAKE_SOURCE_DIR}/include)
- # 定义可执行文件
- add_executable(${PROJECT_NAME} ./src/decode.cpp ./src/rans_interface.cpp)
- # 链接 OpenCV 库
- target_link_libraries(${PROJECT_NAME} ${OpenCV_LIBS})
- # 链接 ONNX Runtime 库
- target_link_libraries(${PROJECT_NAME} onnxruntime)
复制代码 项目编译后能够正常运行。
- mkdir build
- cd build
- cmake ..
- make
复制代码 四、交叉编译安卓版本Opencv
把下载的opencv再解压一份,我这里生存为opencv4.5.4-Android_arm64-v8a,这里编译的是arm64-v8a版本。在这之前先安装安卓ndk,可以参考:安卓交叉编译Python-CSDN博客。
然后利用安卓编译链举行cmake:
-DCMAKE_TOOLCHAIN_FILE和-DCMAKE_ANDROID_NDK记得修改为自己的所在
-DANDROID_NATIVE_API_LEVEL:设置安卓版本,24对应安卓7.0
-DANDROID_ABI:设置平台架构,这里是arm64-v8a,根据需要可以换成armeabi-v7a,x86_64,x64
-DANDROID_STL=c++_shared 和-DBUILD_SHARED_LIBS=ON :用于天生动态库
-DCMAKE_INSTALL_PREFIX:设置安装所在
- cmake -DCMAKE_TOOLCHAIN_FILE=/home/liao/android-ndk-r26d/build/cmake/android.toolchain.cmake \
- -DCMAKE_ANDROID_NDK=/home/liao/android-ndk-r26d \
- -DANDROID_NATIVE_API_LEVEL=24 \
- -DBUILD_ANDROID_PROJECTS=OFF \
- -DBUILD_ANDROID_EXAMPLES=OFF \
- -DCMAKE_BUILD_TYPE=Release \
- -DBUILD_JAVA=OFF \
- -DANDROID_ABI=arm64-v8a \
- -DANDROID_STL=c++_shared \
- -DBUILD_SHARED_LIBS=ON \
- -DCMAKE_INSTALL_PREFIX=/home/liao/opencv-4.5.4-Android_arm64-v8a/install ..
复制代码 然后make举行漫长的编译安装:
编译完成后so库就位于:/home/liao/opencv-4.5.4-Android_arm64-v8a/install/sdk/native/libs/arm64-v8a。通过file指令查看so库可以看到是ARM aarch64架构,分析编译成功了。
五、交叉编译安卓版本onnxruntime
交叉编译onnxruntime还需要下载Android SDK:AndroidDevTools - Android开发工具 Android SDK下载 Android Studio下载 Gradle下载 SDK Tools下载
下载好后直接在ubuntu解压即可,无需安装。把下载的onnxruntime再解压一份,我这里生存为onnxruntime1.18.0-Android_arm64-v8a,这里编译的是arm64-v8a版本。
举行编译:
- ./build.sh --android --android_sdk_path /home/liao/android-sdk-linux --android_ndk_path /home/liao/android-ndk-r26d --android_abi arm64-v8a --android_api 24 --use_nnapi --parallel --build_shared_lib --config MinSizeRel
复制代码 参数介绍:
–android表现build android版
android_sdk_path:下载的SDK文件夹
android_ndk_path:下载的NDK文件夹
android_abi:安卓架构
android_api:安卓版本
parallel: 并行编译
build_shared_lib: 利用就是编译动态库,不利用就是静态库
config: 有4种选项[“Debug”, “MinSizeRel”, “Release”, “RelWithDebInfo”],MinSizeRel可以用于优化目标文件的巨细,,都可以正常利用。
编译完后会在onnxruntime-1.18.0-Android_arm64-v8a/build/Android/MinSizeRel天生libonnxruntime.so。
六、工程CMakeLists.txt
我们在工程根目录下创建lib文件夹,用于存放需要用到的opencv和onnxruntime的so库,然后写CMakeLists.txt,以我的工程为例:
- cmake_minimum_required(VERSION 3.10)
- project(InferenceEncoder_arm64-v8a)
- # 设置 C++ 标准
- set(CMAKE_CXX_STANDARD 17)
- set(CMAKE_CXX_STANDARD_REQUIRED True)
- # 设置OpenCV路径
- set(OPENCV_DIR /home/liao/opencv-4.5.4-Android_arm64-v8a/install/sdk/native)
- # 设置ONNX Runtime路径
- set(ONNX_RUNTIME_DIR /home/liao/onnxruntime-1.18.0-Android_arm64-v8a)
- # 添加ONNXRuntime目录
- include_directories(${ONNX_RUNTIME_DIR}/include)
- include_directories(${ONNX_RUNTIME_DIR}/include/onnxruntime/core/session)
- # 添加opencv目录
- include_directories(${OPENCV_DIR}/jni/include)
- # 添加 ONNXRuntime opencv 库目录
- link_directories(${CMAKE_SOURCE_DIR}/lib)
- # 添加项目的头文件目录
- include_directories(${CMAKE_SOURCE_DIR}/include)
- # 定义可执行文件
- add_executable(${PROJECT_NAME} ./src/encode.cpp ./src/rans.cpp)
- # 链接库
- target_link_libraries(${PROJECT_NAME} ${CMAKE_SOURCE_DIR}/lib/libonnxruntime.so
- ${CMAKE_SOURCE_DIR}/lib/libopencv_core.so
- ${CMAKE_SOURCE_DIR}/lib/libopencv_dnn.so
- ${CMAKE_SOURCE_DIR}/lib/libopencv_imgcodecs.so
- ${CMAKE_SOURCE_DIR}/lib/libopencv_imgproc.so)
复制代码 这里各人看自己代码需要用到opencv哪些so库就把它复制到lib里面即可。写完之后举行交叉编译:
- mkdir build
- cd build
- cmake -DCMAKE_TOOLCHAIN_FILE=/home/liao/android-ndk-r26d/build/cmake/android.toolchain.cmake \
- -DCMAKE_ANDROID_NDK=/home/liao/android-ndk-r26d \
- -DANDROID_NATIVE_API_LEVEL=24 \
- -DANDROID_ABI=arm64-v8a \
- ..
- make
复制代码 编译完成之后就可以在build目录下看到天生的.o文件,通过file指令查看是ARM aarch64架构,分析编译成功了。这里可以根据自己需要再去编译armeabi-v7a,x86-64等架构,只需要改变对应cmake指令中的架构选项。
完结撒花❀❀
参考链接
在linux上用cmake交叉编译opencv到android手机上用 - 简书 (jianshu.com)
onnxruntime android版build & 利用_onnx android-CSDN博客
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。 |