交叉编译_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
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
1. 安装交叉编译工具链 首先需要安装交叉编译工具链,可以根据目标平台的架构选择相应的工具链。以ARM架构为例,可以使用ARM的官方工具链或者使用Ubuntu提供的工具链: ```bash sudo apt-get install gcc-arm-linux-gnueabihf g++-arm-linux-gnueabihf ``` 2. 下载并编译opencv 下载opencv源码,解压后进入源码目录,执行以下命令: ```bash mkdir build cd build cmake -DCMAKE_TOOLCHAIN_FILE=../platforms/linux/arm-gnueabi.toolchain.cmake -DOPENCV_EXTRA_MODULES_PATH=../opencv_contrib/modules -DBUILD_SHARED_LIBS=OFF -DBUILD_TESTS=OFF -DBUILD_PERF_TESTS=OFF -DBUILD_EXAMPLES=OFF -DCMAKE_BUILD_TYPE=RELEASE -DCMAKE_INSTALL_PREFIX=/usr/arm-linux-gnueabihf .. make -j4 ``` 其中,`-DCMAKE_TOOLCHAIN_FILE`指定了交叉编译工具链,`-DOPENCV_EXTRA_MODULES_PATH`指定了opencv_contrib的路径,`-DBUILD_SHARED_LIBS=OFF`表示编译静态,`-DBUILD_TESTS=OFF`、`-DBUILD_PERF_TESTS=OFF`、`-DBUILD_EXAMPLES=OFF`表示不编译测试和示例程序,`-DCMAKE_BUILD_TYPE=RELEASE`表示编译优化,`-DCMAKE_INSTALL_PREFIX`指定了安装目录。 编译完成后,执行以下命令安装opencv: ```bash sudo make install ``` 3. 链接静态 在编译自己的程序时,需要链接opencv的静态。以CMake为例,可以在`CMakeLists.txt`中添加以下代码: ```cmake set(OpenCV_STATIC ON) find_package(OpenCV REQUIRED) target_link_libraries(your_target ${OpenCV_LIBS}) ``` 其中,`set(OpenCV_STATIC ON)`指定链接静态,`find_package(OpenCV REQUIRED)`查找opencv,`target_link_libraries(your_target ${OpenCV_LIBS})`链接静态。需要注意的是,交叉编译时需要指定正确的路径和头文件路径。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值