交叉编译_Opencv源码交叉编译Android库

013da1a73c635b7f025cd58258859a67.png

Opencv源码交叉编译Android库

1. 交叉编译环境

  1. 使用NDK交叉编译工具链编译,下载地址: https://developer.android.google.cn/ndk/downloads , 建议下载19或之前版本,20之后版本编译可能会出现错误;

2. 编译Openc Android库

下载OpenCV(这里使用的是2.4.13), 在OpenCV目录下运行以下命令:

# 创建build目录,并进入
rm -r build_armv8 
mkdir build_armv8
cd build_armv8


cmake -DCMAKE_TOOLCHAIN_FILE=/yourNDKPath/android-ndk-r19c/build/cmake/android.toolchain.cmake 
-DCMAKE_ANDROID_NDK=/yourNDKPath/android-ndk-r19c 
-DANDROID_NATIVE_API_LEVEL=21 
-DBUILD_ANDROID_PROJECTS=OFF 
-DBUILD_ANDROID_EXAMPLES=OFF 
-DCMAKE_BUILD_TYPE=Release  
-DBUILD_JAVA=OFF  
-DANDROID_ABI="arm64-v8a" 
-DCMAKE_ANDROID_ARCH_ABI=arm64-v8a 
-DCMAKE_INSTALL_PREFIX=/yourInstallPath/ ..

make -j8

make install

其中,yourNDKPath表示下载的NDK的目录,yourInstallPath表示编译产生的文件所存放的目录(我这边叫Opencv_Android_armv8, 如下面的图)

编译之后,会在yourInstallPath下出现OpenCV的头文件,静态库,动态库等文件,如下图:

2c59078925cdbbb5a14c5647f8eb271f.png

3. 程序编译

编译好OpenCV安卓库之后,可以将库导进自己的程序中,以下是一个小示例:

  1. main.cpp 文件,下面是一个简单的CPP文件,使用opencv读取图片并且输出图片尺寸:
#include <iostream>
#include <opencv2/opencv.hpp>
#include <opencv2/core/core.hpp>
#include <opencv2/highgui/highgui.hpp>

int main() {
    cv::Mat image;
    image = cv::imread("./Picture1.png"); 

    std::cout << "Image width: " << image.cols << std::endl;
    std::cout << "Image height: " << image.rows << std::endl;
    std::cout << "Read image successful!!!" << std::endl;
    return 0;
}

2. CMakeLists.txt 文件, 用于工程编译, 导入OpenCV库文件

cmake_minimum_required(VERSION 3.17)
project(ArmNenoOptim)
message(STATUS "root This is BINARY dir " ${PROJECT_BINARY_DIR})
message(STATUS "root This is SOURCE dir " ${PROJECT_SOURCE_DIR})

set(CMAKE_CXX_STANDARD 11)

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

# 设置Openc根目录
set(OpenCVHome /home/canyu/software/opencv_android_armv8/sdk/native)
# 将编译好的OpenCV库导进工程中
include_directories(${OpenCVHome}/jni/include)
include_directories(${OpenCVHome}/jni/include/opencv)
include_directories(${OpenCVHome}/jni/include/opencv2)
link_directories(${OpenCVHome}/libs/arm64-v8a
        ${OpenCVHome}/3rdparty/libs/arm64-v8a)

# 链接各个库文件
link_libraries(
        opencv_androidcamera
        opencv_calib3d
        opencv_contrib
        opencv_core
        opencv_features2d
        opencv_flann
        opencv_gpu
        opencv_highgui
        opencv_imgproc
        opencv_legacy
        opencv_ml
        opencv_nonfree
        opencv_objdetect
        opencv_ocl
        opencv_photo
        opencv_stitching
        opencv_superres
        opencv_ts
        opencv_video
        opencv_videostab
        IlmImf
        libjasper
        libpng
        libjpeg
        libtiff
        log
        z
)

# 生成可执行程序
add_executable(ArmOpenCV ./src/main.cpp)

3. 编译工程

export ANDROID_NDK=/yourNDKPath

rm -r build
mkdir build
cd build

# 执行交叉编译
cmake -DCMAKE_TOOLCHAIN_FILE=$ANDROID_NDK/build/cmake/android.toolchain.cmake 
    -DANDROID_ABI="arm64-v8a" 
    -DANDROID_NDK=$ANDROID_NDK 
    -DANDROID_PLATFORM=android-21 
    ..

make -j8

4. 安卓端测试

将编译好的可执行文件与任意一张图像push进Android设备中:

cd build 
adb push ArmOpenCV /data/local/tmp 
adb push Picture1.png /data/local/tmp

进入Android设备终端,并执行可执行文件:

adb shell cd /data/local/tmp ./ArmOpenCV

会看到输出:

Image width: 553 
Image height: 384 
Read image successful!!!

4. 总结

理清楚就不难,只要将编译的工具链换成NDK提供的交叉编译工具链即可。

相关代码存放在github中,欢迎star :

https://github.com/xcyuyuyu/ArmOpenCV​github.com
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值