【Atlas500】入门(十三)——opencv交叉编译与使用

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项目

  1. 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;
}
  1. 写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})
  1. 准备交叉编译的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)
  1. 所有文件截图

现在在文件夹下有三个文件:

  • atlas500_host.cmake
  • CMakeLists.txt
  • image_show.cpp
    在这里插入图片描述
  1. 编译
mkdir build && cd build
cmake -DCMAKE_TOOLCHAIN_FILE=../atlas500_host.cmake ..
make

在build文件夹会生成可执行文件facedemo_main,将pig.png文件copy到build文件夹下。然后将这个文件夹上传到atlas500.

  1. 测试
  • 上传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,其他是一样的。

猜你喜欢

转载自blog.csdn.net/u011622208/article/details/107339565