OpenCV交叉编译—arm(imx6ull,Cortex-A7)

一、版本说明:

opencv - 4.2.0(opencv4.5.4版本在交叉编译时会报错)
Ubuntu - 20.04 64位
gcc version 4.9.4 (Linaro GCC 4.9-2017.01)
arm板:imx6ull, Cortex - A7
内核挂载:nfs+SecureCRT

二、环境准备:

1)交叉编译器安装:

1、下载

https://releases.linaro.org/components/toolchain/binaries/4.9-2017.01/arm-linux-gnueabihf/

在这里插入图片描述

2、选择路径

根据自己Ubuntu来下载,下载完以后复制到自己要安装的路径,也可以不移动。
完成以后使用命令解压:

3、解压

sudo tar -vxf gcc-linaro-4.9.4-2017.01-x86_64_arm-linux-gnueabihf.tar.xz

4、修改环境变量

解压完以后修改环境变量,使用命令:

sudo vi /etc/profile

打开这个文件以后,在最后面输入:

export PATH=$PATH:/usr/local/arm/gcc-linaro-4.9.4-2017.01-x86_64_arm-linux-gnueabihf/bin

其中,usr/local/arm/是在前文设置移动安装的路径,要根据自己的情况修改。

5、验证安装

修改好以后就保存退出,重启 Ubuntu 系统,交叉编译工具就安装成功了。
输入命令来验证安装:

arm-linux-gnueabihf-gcc -v

如果安装成功,会显示:

gcc version 4.9.4 (Linaro GCC 4.9-2017.01) 

2)安装cmake-gui:

命令:

sudo apt-get install cmake-gui  #安装cmake-gui

3)下载opencv源码:

地址:

https://codeload.github.com/opencv/opencv/zip/refs/tags/4.2.0

解压:

unzip opencv-4.2.0

创建文件夹用于存放编译文件:

mkdir opencv/build   

创建文件夹用于存放安装的opencv

mkdir opencv/opencv_install

三、编译安装:

1)打开cmake-gui界面

sudo cmake-gui
1、里面填写opencv的安装路径
2、里面填写刚刚创建的存放编译文件的文件夹的路径
3、点击“Configure”

在这里插入图片描述

在Unix Makefiles下,选择第三个,实测有效。

在这里插入图片描述

2)选择对应平台

/XXX/opencv-4.2.0/platforms/linux/xxx.cmake

注意要与自己的路径和自己的arm板子匹配
在这里插入图片描述

由于我的arm板是imx6ull,cortex—A7,选择这个,可以根据自己的板子选择下面对应的选项
在这里插入图片描述
点击Finish以后会到下面的界面:

3)继续配置

在这里插入图片描述

勾选 Advanced;
在Search中搜索BUILD_JPEGBUILD_PNG并分别打上对勾
在这里插入图片描述

搜索CMAKE_BUILD_TYPE ,在值中填写Release
在这里插入图片描述
搜索install,在“CMAKE_INSTALL_PREFIX”中将创建的用于存放安装的opencv的文件夹填写进去
在这里插入图片描述

搜索CMAKE_EXE_LINKER_FLAGS在值中填写-pthread -ldl -lrt
单击Configure,没有红色即说明没有错误;
在这里插入图片描述

单击Generate,即可关闭cmake-gui

4)最后一步

配置完成后先不要着急使用make编译
在/XXX/opencv4.2.0/3rdparty/protobuf/src/google/protobuf/stubs/common.cc这个文件下添加#define HAVE_PTHREAD宏定义。
回到刚刚创建的用于存放编译文件的文件夹:build中

5)编译:

使用命令:make -j4

可以看出,编译成功!
在这里插入图片描述

6)安装:

make install

在这里插入图片描述
安装成功
在这里插入图片描述

四、配置环境

步骤与正常安装OpenCV差不多

1)首先将OpenCV-arm的库添加到路径,从而可以让系统找到

sudo gedit /etc/ld.so.conf.d/opencv-arm.conf 

执行此命令后打开的可能是一个空白的文件,不用管,只需要写上:

/home/wcs/Downloads/opencv-4.2.0/opencv_install/lib

路径应与自己的相照应,否则报错
路径下为lib库,如下图
在这里插入图片描述

2)使得刚才的配置路径生效:

执行如下命令:

sudo ldconfig 

3)配置bash:

sudo gedit /etc/bash.bashrc

在文件后面添加:

PKG_CONFIG_PATH=$PKG_CONFIG_PATH:/home/wcs/Downloads/opencv-4.2.0/opencv_install/lib/pkgconfig

在这里插入图片描述

4)执行如下命令使得刚才的配置生效:

source /etc/bash.bashrc 

5)拷贝pkgconfig文件

在编译时已配置了PKGCONFIG项,但最后安装在lib目录下并没有,将之前在Ubuntu上安装的OpenCv库(非交叉编译)目录下lib/pkgconfig文件夹拷贝到交叉编译的安装位置:/home/wcs/Downloads/opencv-4.2.0/opencv_install/lib目录下,pkgconfig目录下有个opencv4.pc文件,将其重命名为 opencv-arm.pc。
并更改里面的路径:
在这里插入图片描述

6)验证

首先使用命令:

pkg-config --modversion opencv-arm

成功输出版本号
在这里插入图片描述

再写个程序验证下

main.cpp:

#include <opencv2/opencv.hpp>
#include "opencv2/highgui.hpp"
#include "opencv2/imgproc.hpp"
#include <iostream>
using namespace std;
int main(int argc, char* argv[]) {
    printf("hello!!! \n"); //输出hello
    const char* imagename = "xiaomaolv.jpg";//此处为你自己的图片路径
    // 从文件中读入图像::
    cv::Mat img = cv::imread(imagename, 1);
	//如果读入图像失败
    if (img.empty()) {
        fprintf(stderr, "Can not load image %s\n", imagename);
        return -1;
    	}
    //显示图像
    cv::imshow("image", img);
    printf("successfully open image!\n");
	cv::waitKey();
    return 0;
}

使用命令交叉编译:

arm-linux-gnueabihf-g++ -std=c++11 `pkg-config --cflags opencv-arm` `pkg-config --libs opencv-arm` -lpthread -lrt -ldl  main.cpp -o main1

成功编译!
在这里插入图片描述

五、移植

1)压缩打包

进入安装文件夹,使用命令打包:

tar -czvf opencv4_2.tar.gz ./*

在这里插入图片描述

arm端可以创建一个目录,用来存放交叉编译好的opencv:

我的目录是:/usr/opencv

2)发送

对应的,发送到arm端的命令为:

sudo cp opencv4_2.tar.gz /home/wcs/Linux/nfs/rootfs/usr/opencv/

解压后可以看到:
在这里插入图片描述
将编译好的二进制可执行文件发过来:

sudo cp main1 /home/wcs/Linux/nfs/rootfs/test/ -f

进入相应的路径下./main运行一下:

出现错误:

error while loading shared libraries: libopencv_gapi.so.4.2: cannot open shared object file: No such file or directory

解决方法:

/usr/opencv/lib下面的.so文件全部拷贝到/lib目录下

cd /home/wcs/Linux/nfs/rootfs/usr/opencv/lib/  #进入目录下
cp ./* /lib 				#拷贝所有lib文件到/lib下

在这里插入图片描述
可以看出来,程序已经是可以正常运行了,但是还是报了什么错误,原因是使用了cvloadiamge之类的highgui中的功能,解决方法是在开发板上搭建起来QT库来显示GUI。

BTW

交叉编译opencv时如果出现以下错误:

arm-linux-gnueabihf/libc/usr/include/features.h:311:52: error: operator ‘&&’ has no right operand
#if defined _FILE_OFFSET_BITS && _FILE_OFFSET_BITS == 64
在这里插入图片描述
在#if defined前面 加上
#define _FILE_OFFSET_BITS 64

猜你喜欢

转载自blog.csdn.net/AcetylcholineACh/article/details/129967999