OpenCv交叉编译—arm(ZYNQ7020,Cortex-A9)

1 篇文章 0 订阅
1 篇文章 0 订阅

针对本菜鸟在利用petalinux交叉编译器在交叉编译OpenCv时遇到的一些坑,在此做一些经验交流,说的不对的地方请大佬指正(疯狂叠甲)

一、版本说明:

​​​​OpenCv -4.5.5(使用最新的4.8.0在cmake-gui的时候会报错) 

Ubuntu - 16.04.1

Vmware:17

gcc version 7.3.1 20180314 (Linaro GCC 7.3-2018.04-rc3)

arm板:ZYNQ7020, Cortex - A9

内核挂载:nfs&mount

二、环境准备:

1)petalinux交叉编译器介绍与下载
1、petalinux介绍

Petalinux 支持 Versal、Zynq UltraScale+ MPSoC、Zynq-7000 SoC 以及 MicroBlaze,可与 Xilinx 硬件设计工具 Vivado 协同工作、大大简化了 Linux 系统的 开 发工作。具体的介绍可访Petalinux 工具网站 :https://china.xilinx.com/products/design-tools/embedded-software/petalinux-sdk.html

2、petalinux下载
https://china.xilinx.com/

安装步骤大家可以参考zdyz的教程,本人在这里就不作详细的描述了。

安装成功后可以在Ubuntu输入以下命令来验证:

sptl
PetaLinux environment set to '/home/cqs/petalinux/2018.3'
INFO: Checking free disk space
INFO: Checking installed tools
INFO: Checking installed development libraries
INFO: Checking network and other services
WARNING: No tftp server found - please refer to "PetaLinux SDK Installation Guide" for its impact and solution
arm-linux-gnueabihf-g++ -v
gcc version 7.3.1 20180314 (Linaro GCC 7.3-2018.04-rc3)

其中,WARNING是由于没有安装tftp的警告,我没有安装,但是无伤大雅。

2)安装cmake-gui:

为什么要用cmake-gui而不是直接通过cmake进行交叉编译呢?

问得好!这也是cmake-gui的意义所在,用我的理解:首先cmake-gui能够帮助你更加方便的修改你想要修改的参数;第二点就算能够更加高效的管理你的OpenCv库以及其他库。(点到为止啦)

在Ubuntu下输入:

sudo apt-get install cmake-gui    #安装cmake-gui
3)下载OpenCv源码:

https://github.com/opencv        我下载的是4.5.5版本的

当然这里你可以直接在Ubuntu里clone下来,但是我用的笨办法...

将github上的源码压缩包复制粘贴到文件夹下(我选择的路径是/home/用户名/opencv-ARM):

解压:

tar -xzf opencv-4.5.5.tar.gz

创建build文件夹和install文件夹分别用于存放编译文件和安装的OpenCv:

mkdir build
mkdir install

创建完成后:

当然,大家已经可以删掉安装包了,如果确定之后不会想要重投来过。

三、编译安装(重点):

1)打开cmake-gui界面
cd build     #进入build目录
cmake-gui    #打开cmake-gui界面
2)选择对应路径后点击Configure

3)在Unix Makefiles下选择第四个

4)配置交叉编译器

其中,第一个注意大小写区分,一定要是大写的Linux,不然后续可能会出现奇奇怪怪的bug;

第二个选择C交叉编译工具所在的位置;

第三个选择C++交叉编译器工具所在的位置;

第四个选择交叉编译器所在路径的上一级目录,也就是到/bin这里。

点击Finsh

5)点击Configure

出现Configure done之后,在Search栏搜索PREFIX,并将改路径设置为install所在路径,然后再点击Configure。目的是将交叉编译安装的东西都放在install下。

6)点击Configure直到出现Configuring done

出现Configuring done之后点击Generate,等待Generating done,就可以关闭cmake-gui了。

7)编译及安装

在build目录下输入:

make -j8

请喝杯咖啡耐心等待直到100%

不得不感叹,绿色真是赏心悦目。然后执行make install,等待直到100%

至此,OpenCv就交叉编译成功了,在install文件目录下生成了四个文件夹。分别是bin、include、lib,share。share没用,不用管它,其他三个文件都是你交叉编译应用程序需要用到的。

其实讲到这里就差不多了,但是我在后续交叉编译应用程序的时候也遇到了很多困难,本人猜测是CMakeLists.txt写的有问题,踩过很多坑之后,终于有一版能用的CMakeLists.txt。下面我利用CMakeLists.txt文件对一个简单的opencv应用程序进行板级测试。

四、OpenCv板级测试

1)创建C++应用程序

创建一个工程文件夹(我的为CSDN),进入文件夹中再创建一个用于存放交叉编译好的OpenCv库的文件夹(我的为3rdparty-arm)。将刚才install文件夹里的bin、include、lib复制粘贴到3rdparty-arm目录下。

然后在CSDN目录下创建应用程序文件,CMakeLists.txt,以及需要测试的图片。

下面给出应用文件代码以及CMakeLists.txt代码。仅供参考

test.cpp:

#include<iostream>
#include</home/cqs/CSDN/3rdparty-arm/include/opencv4/opencv2/core/core.hpp>
#include</home/cqs/CSDN/3rdparty-arm/include/opencv4/opencv2/highgui.hpp>
#include</home/cqs/CSDN/3rdparty-arm/include/opencv4/opencv2/opencv.hpp>
 
using namespace cv;
using namespace std;
 
#define Usage()\
{std::cerr<<"usage: ./showpic FILE"<<std::endl;}
int main (int argc, char* argv[])
{
  if(argc !=2) Usage();
  cv::Mat img_gray,img;
  img=cv::imread("bus.jpg");
  cvtColor(img,img_gray,COLOR_BGR2GRAY);
  //cv::imshow("window",img);
  //cv::imshow("Display window",img);
  cv::imwrite("save.jpg",img_gray);
  cv::waitKey(0);
  return 0;
}

由于我的板子没配置UI所以选择利用保存的方式观察现象。

CMakeLists.txt:

cmake_minimum_required(VERSION 3.5)
project(test)
set(CMAKE_CXX_STANDARD 14)
set(CMAKE_CXX_FLAGS "-pthread")

set(CMAKE_SYSTEM_NAME Linux)
set(CMAKE_SYSTEM_PROCESSOR arm)


set(TOOLCHAIN_DIR "/home/cqs/petalinux/2018.3/tools/linux-i386/gcc-arm-linux-gnueabi")

#CMAKE_FIND_ROOT_PATH是-c++源码存放路径
set(CMAKE_FIND_ROOT_PATH ${TOOLCHAIN_DIR})

if(NOT CMAKE_FIND_ROOT_PATH_MODE_PROGRAM)
    set(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER)
endif()
if(NOT CMAKE_FIND_ROOT_PATH_MODE_LIBRARY)
    set(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY)
endif()
if(NOT CMAKE_FIND_ROOT_PATH_MODE_INCLUDE)
    set(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY)
endif()
if(NOT CMAKE_FIND_ROOT_PATH_MODE_PACKAGE)
    set(CMAKE_FIND_ROOT_PATH_MODE_PACKAGE ONLY)
endif()

set(CMAKE_CXX_COMPILER ${TOOLCHAIN_DIR}/bin/arm-linux-gnueabihf-g++)
set(CMAKE_C_COMPILER ${TOOLCHAIN_DIR}/bin/arm-linux-gnueabihf-gcc)


set(OpenCV_DIR ${CMAKE_SOURCE_DIR}/3rdparty-arm/lib/cmake/opencv4)
find_package(OpenCV 4 REQUIRED)
message(STATUS "    libraries: ${OpenCV_LIBS}")
message(STATUS "    include path: ${OpenCV_INCLUDE_DIRS}")
include_directories($OpenCV_DIR)

set(CMAKE_C_FLAGS "-march=armv7-a -mfloat-abi=hard -mfpu=neon")
set(CMAKE_CXX_FLAGS "-march=armv7-a -mfloat-abi=hard -mfpu=neon")

add_executable( ${PROJECT_NAME} test.cpp )


target_link_libraries( ${PROJECT_NAME} ${OpenCV_LIBS} )

然后在CSDN文件夹下依次操作:

mkdir build
cd build
cmake ..
make

成功交叉编译应用文件!

上板子测试!

问题它又又又来了,我直接告诉大家吧,码累了...这里是需要将OpenCv的动态库添加进来,如何查看test应用程序需要的动态库呢?有知道的可以在评论区打出来。

我将需要用到的动态库打包到lib3文件夹中然后拷贝到板子的/usr/lib中,然后在终端输入:

export LD_LIBRARY_PATH=/usr/lib/lib3:$LD_LIBARY_PATH

导入动态库后就可以执行应用程序test:

然后在Ubuntu的nfs目录即可查看最终结果。

下班!

评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值