一、版本说明:
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_JPEG
、BUILD_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