目标:将opencv进行交叉编译,使其能在rk3326板子上运行使用。
环境:
ubuntu:18.04
opencv:4.5.4
opencv源码从挂网下载:opencv源码下载地址
交叉编译链:gcc-arm-10.3-linux-gun
一.环境准备
1.交叉编译链我配置在/opt/gcc-arm-10.3-linux-gun中,可根据实际情况自行配置目录;
2.opencv源码我下载后解压在家目录下的“software/opencv_linux/opencv-4.5.4”中;
3.下载“opencv_contrib-4.5.4”,下载这个是由于特定项目要用到,如果没有特殊要求,可以不用(后面会介绍这个contrib配置在哪)。
4.下载“boostdesc_bgm.i-main”,这个也是项目特定要求需要,如果没有特殊要求,可以不用。
二.依赖库安装
1.安装cmake,安装命令:
suod apt-get install cmake
suod apt-get install cmake-qt-gui
2.安装依赖库,安装命令:
sudo apt-get update
sudo apt-get install build-essential
sudo apt-get install git libgtk2.0-dev pkg-config libavcodec-dev libavformat-dev libswscale-dev
sudo apt-get install libtbb2 libtbb-dev libjpeg-dev libpng-dev libtiff-dev libjasper-dev libdc1394-22-dev
sudo apt-get install libgtk-3-dev libtiff5-dev
sudo apt install libgstreamer-plugins-base1.0-dev libgstreamer1.0-dev
sudo apt install libopenexr-dev libwebp-dev
sudo apt-get install libcanberra-gtk-module
3.安装python环境,某些依赖库需要python环境,不然编译不过,安装命令:
sudo apt install python3-dev
sudo apt install python3-numpy
4.将boostdesc_bgm.i-main 下的文件复制到“opencv_contrib/modules/xfeatures2d/src/” (前文环境准备中的第四步),此步骤为特定项目,解决下载慢问题,离线下载,如果没有特殊要求可以跳过此步骤;
三.配置make
1.执行命令打开cmake工具:
sudo cmake-gui
分别输入source code源代码路径和 build生成路径,然后点击“Configure”按钮。
选择第四个选项,进行自主配置:
注意,这里一定改设置你准备上板子的交叉编译链,别选错编译链,到时候调用出错,那就白编译了。
2.接下来就是配置cmake,
(1)勾选"Advanced";
(2)找到“CMAKE BUILD TYPE”,设置值为“Release”;
(3)找到“CMAKE EXE LINKER FLAGS”,设置值为“-pthread -ldl -rt”;
(4)找到“BUILD_ZLIB”并勾选;
(5)找到“CMAKE_INSTALL_PREFIX”,设置安装目录,我这里设置值为“/usr/local/opencv4.5.4”;
(6)找到“OPENCV_EXTRA_MODULES_PATH”,设置值为MODULES所在目录。注意:此步骤是本项目特定要求的,参见前文准备环境中的第三条,如果没有特定要求,跳过此步;
(7)点击“Configure”按钮重新配置,执行需要一段时间,静待状态栏提示“Configuring done”;
(8)再点击“Generate”按钮生成makefile文件,执行需要一段时间,静待状态栏提示“Generating done”;
至此,opencv源码包目录下的build文件夹中makefile文件已经生成,关闭cmake工具,可以准备make编译了。
四.make编译
1.进入到上文中的opencv中的build目录下,执行命令:
make -j4
2.编译过程中可能会出现多种报错
(1)如下“system Error:Permission denied”这是没有权限
改用“sudo make -j4”命令;
(2)遇到错误“错误: #error "No suitable threading library available.”
解决方法:在opencv源码路径下的“opencv-4.5.4/3rdparty/protobuf/src/google/protobuf/stubs/common.cc” 文件中的开始处,有很多包含的头文件,在此处添加这一行
#define HAVE_PTHREAD
(3)继续重新编译尝试,遇到错误如下:
这是交叉编译工具链有漏洞,按报错文件指向,在交叉编译工具链的目录下找到“features.h”,打开该头文件,在#if defined前面 加上这句
#define _FILE_OFFSET_BITS 64
(4)再次重新编译尝试,遇到报错:“undefinedreference to png do expand palette rgba8 neon”
解决办法:在opencv源码目录下找到“3rdparty/libpng/pngpriv.h”头文件,找到
#if (defined(ARM_NEON) || defined(__ARM_NEON)) &&
将其改为:
#if defined(PNG_ARM_NEON) && (defined(ARM_NEON) || defined(__ARM_NEON)) &&
以上,可能还会出现其他错误的话,就要根据报错信息网上查找解决。
3.编译完成
4.执行安装命令:
sudo make install
安装完成后,可以发现opecv编译好的so库已经在你指定的安装目录下了。我指定安装在“/usr/local/opencv4.5.4/”下,该目录下lib中就是opencv的各个so库。
至此,opencv交叉编译完成。