1. 交叉编译opencv
1.安装Atlas500的交叉编译环境
a.在ubuntu16.04(x86_64服务器), 解压Atlas500-ESP.zip,获得Euler_compile_env_cross.tar.gz;
b.解压Euler_compile_env_cross.tar.gz,获取Euler_compile_env_cross文件夹,即为Atlas提供的交叉编译工具;
c.修改/etc/profile,设置环境变量, 注意修改以下为Euler_compile_env_cross文件夹的绝对路径,添加至文件最后:
export PATH=$PATH:<where you place>/Euler_compile_env_cross/arm/cross_compile/install/bin
应用生效
#source /etc/profile
d.查看交叉编译工具aarch64-linux-gnu-g++版本,验证是否生效
#aarch64-linux-gnu-g++ -v
e.,请务必使用3.14及以上版本cmake,编写交叉编译工具的cmake编译器脚本,并保存为Euler.cmake,注意修改以下为Euler_compile_env_cross文件夹的绝对路径:
set(CMAKE_SYSTEM_NAME Linux)
set(CMAKE_SYSTEM_PROCESSOR aarch64)
#
set(tools <where you place>/Euler_compile_env_cross/arm/cross_compile/install)
set(CMAKE_SYSROOT ${tools}/sysroot)
set(CMAKE_C_COMPILER ${tools}/bin/aarch64-linux-gnu-gcc)
set(CMAKE_CXX_COMPILER ${tools}/bin/aarch64-linux-gnu-g++)
set(CMAKE_AR ${tools}/bin/aarch64-linux-gnu-ar)
set(CMAKE_RANLIB ${tools}/bin/aarch64-linux-gnu-ranlib)
set(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER)
set(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY)
set(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY)
set(CMAKE_FIND_ROOT_PATH_MODE_PACKAGE ONLY)
PS:可参考《Atlsa500 应用软件开发指导书》,文档及软件包下载地址:
https://support.huawei.com/enterprise/zh/ai-computing-platform/atlas-500-pid-23464104
2.下载opencv源码
源码地址: https://github.com/opencv/opencv/releases
推荐版本: 请根据Atlas软件版本选择合适版本
3.解压后,进入opencv软件包根目录,请注意修改命令中的路径为绝对路径,依次执行以下命令:
#mkdir build
#cd build
#cmake \
-DCMAKE_TOOLCHAIN_FILE=<where you place Euler.cmake>/Euler.cmake \
-DCMAKE_INSTALL_PREFIX=<where you want to install>/opencv \
-DWITH_WEBP=OFF \
-DBUILD_opencv_world=ON ..
#make
#make install
4.编译时,链接opencv:
Header file: /opencv/include/
Shared library folder: /opencv/lib/
5.将opencv的链接库拷贝到Atlas500上,并将该目录添加到系统动态连接口目录:
#export LD_LIBRARY_PATH=${LD_LIBRARY_PATH}:<where you place in Atlas500>/opencvLibs
2. 使用cmakelists.txt编译opencv项目
- code
这里用opencv读入一张图片,resise一下,在保存
#include "opencv2/opencv.hpp"
int main(int argc, char* argv[]){
cv::Mat img = cv::imread("./pig.png");
cv::resize(img, img, cv::Size(600, 400));
cv::imwrite("./res.jpg", img);
return 0;
}
- 写CMakeLists.txt
和x86主机中写cmakelists是一样的。其中有两个需要注意的地方:
- include_directories:指向opencv安装位置对应的头文件目录
- find_library:so库的目录
cmake_minimum_required(VERSION 2.8)
add_compile_options(-std=c++11 -fPIE -fstack-protector-all)
project(opencv_image_show)
include_directories(/home/yangna/chenjun/Atlas_dependence/opencv_install/include) # 1. opencv头文件
find_library(OpenCV_LIBS opencv_world /home/yangna/chenjun/Atlas_dependence/opencv_install/lib) # 2. opencv库文件目录
file(GLOB SRC *.cpp)
add_executable(facedemo_main ${SRC})
target_link_libraries(facedemo_main ${OpenCV_LIBS})
- 准备交叉编译的cmake_toolchain_file
新建一个atlas500_host.cmake
文件,写入。注意tools的路径根据自己的情况设置
set(CMAKE_SYSTEM_NAME Linux)
set(CMAKE_SYSTEM_PROCESSOR arm)
set(tools /home/yangna/Atlas500_DDK/toolchains/Euler_compile_env_cross/arm/cross_compile/install/)
#set(CMAKE_SYSROOT ${tools}/sysroot)
set(CMAKE_C_COMPILER ${tools}/bin/aarch64-linux-gnu-gcc)
set(CMAKE_CXX_COMPILER ${tools}/bin/aarch64-linux-gnu-g++)
set(CMAKE_AR ${tools}/bin/aarch64-linux-gnu-ar)
set(CMAKE_RANLIB ${tools}/bin/aarch64-linux-gnu-ranlib)
set(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER)
set(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY)
set(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY)
set(CMAKE_FIND_ROOT_PATH_MODE_PACKAGE ONLY)
- 所有文件截图
现在在文件夹下有三个文件:
- atlas500_host.cmake
- CMakeLists.txt
- image_show.cpp
- 编译
mkdir build && cd build
cmake -DCMAKE_TOOLCHAIN_FILE=../atlas500_host.cmake ..
make
在build文件夹会生成可执行文件facedemo_main,将pig.png文件copy到build文件夹下。然后将这个文件夹上传到atlas500.
- 测试
- 上传atlas平台
scp -r ./build/ root@test:192.168.143.123:/root/test/
- 测试
cd /root/test/build
./facedemo_main
会得到一张600×400的res.jpg
3. 总结
- 和x86的电脑相比,多了一个cmake_toolchain_file,其他是一样的。