Opencv源码交叉编译Android库
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的头文件,静态库,动态库等文件,如下图:
3. 程序编译
编译好OpenCV安卓库之后,可以将库导进自己的程序中,以下是一个小示例:
- 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/ArmOpenCVgithub.com