网站菜单

ARM嵌入式开发——OpenCV交叉编译

工作需要,现在需要在ARM开发板进行C++的图像处理环境搭建。

以前都是在Anaconda或者Pycharm上使用Python进行操作,第一次在Linux上基于C++操作,沿途采坑无数,遂记录一下,也方便以后复现。

开始之前先说一下交叉编译的好处:嵌入式设备普遍存储空间不大,如果在嵌入式设备进行大量编译操作很容易造成空间不足,并且浪费时间。最近由于工作需要,需要在Toybrick的RK3399PRO_X上运行OpenCV,直接编译一个调用相机的简单程序耗时超过两小时,遂在X86 PC端进行交叉编译,然后将编译好的文件拷贝到ARM设备。

第一步:安装交叉编译器

以gcc-aarch64-linux-gnu为例

1. Linux X86下安装ARM架构编译器

sudo apt-get install g++-aarch64-linux-gnu
sudo apt-get install gcc-aarch64-linux-gnu

下载后在终端输入以下指令查看编译器版本

aarch64-linux-gnu-g++ -v
aarch64-linux-gnu-gcc -v

第二步:OpenCV交叉编译

下载OpenCV,我这里使用的是OpenCV3.4,从OpenCV的Github页面直接下载。

opencv的交叉编译工具链在../opencv3.2.0/platforms/linux 路径下,linux文件夹下是一些.cmake文件,对应不同的移植对象,本人需要在Toybrick的RK3399PRO_X部署模型,所以选择aarch64-gnu.toolchain.cmake 工具链。通过arch指令查看自己的CPU架构。

在进行编译前,需要修改cmake文件,因为是aarch64,则修改platform/linux/aarch64-gnu.toolchain.cmake,改为如下:

set(CMAKE_SYSTEM_PROCESSOR aarch64)
set(GCC_COMPILER_VERSION "" CACHE STRING "GCC Compiler version")
set(CMAKE_C_COMPILER /usr/bin/aarch64-linux-gnu-gcc)
set(CMAKE_CXX_COMPILER /usr/bin/aarch64-linux-gnu-g++)
set(GNU_MACHINE "aarch64-linux-gnu" CACHE STRING "GNU compiler triple")
include("${CMAKE_CURRENT_LIST_DIR}/arm.toolchain.cmake")

接下来执行交叉编译。首先在OpenCV3.4下新建文件夹 aarch_64_install和build,进入build,在终端执行如下命令:

sudo cmake -DCMAKE_MAKE_PROGRAM:PATH=/usr/bin/make -DCMAKE_INSTALL_PREFIX=../aarch_64_install -DWITH_CUDA=OFF -DENABLE_PRECOMPILED_HEADERS=OFF -DCMAKE_TOOLCHAIN_FILE=../platforms/linux/aarch64-gnu.toolchain.cmake -DCUDA_GENERATION=Kepler ..

-DCMAKE_INSTALL_PREFIX 指定编译文件make install后保存路径。然后运行:

make -j4
make install

编译结束后进入aarch_64_install文件夹,里面已经生成了bin, include, lib, share四个文件夹。

踩坑1:编译过程报错

解决办法:多线程错误,尝试直接make,不要-j4

第三步:Linux上生成ARM架构下可执行文件

创建测试用test.cpp,内容如下

#include <opencv2/opencv.hpp>
 
using namespace cv; 
 
int main( int argc, char** argv )  
{  
	Mat image;  
 
	image = imread( "7.bmp", 1 );  
	if( !image.data )  
	{  
		printf( "No image data \n" );  
		return -1;  
	}   
 
	cv::Point lu = cv::Point(180, 60); 
	cv::Point rd = cv::Point(400, 260);   
 
	cv::rectangle(image, lu, rd, cv::Scalar( 255, 20, 0 ), 1, CV_AA );                 	
 
	imwrite("8.bmp", image);        
 
	return 0;  
}

在终端执行:

/usr/bin/aarch64-linux-gnu-g++ -o draw_image test.cpp -I ../aarch_64_install/include/ ../aarch_64_install/lib/libopencv_core.so ../aarch_64_install/lib/libopencv_imgcodecs.so ../aarch_64_install/lib/libopencv_imgproc.so

在test.cpp同一目录下会生成可执行文件 draw_image,利用file draw_image检查可执行文件格式是否支持arrch64。输出为:

draw_image: ELF 64-bit LSB shared object, ARM aarch64, version 1 (GNU/Linux), dynamically linked, interpreter /lib/ld-linux-aarch64.so.1, for GNU/Linux 3.7.0, BuildID[sha1]=42f4ae7c66a0875bc0d49e4195ff35aa08f15cbe, not stripped 

出现如上结果说明可执行文件支持ARM arrch64

第四步:移植ARM端执行

将aarch_64_install文件夹下的include和lib里的文件分别拷贝到ARM板的/usr/include 和/usr/lib下 然后打开终端执行可执行文件即可。

踩坑2:报错Libopencv_core so 3.4 cannot open shared object file: No such file or directory

原因是OpenCV的当前安装目录为/usr/local/lib下,而读取的位置为/usr/lib下。因此需要将复制过来的lib和include文件夹复制到/user/中。

sudo cp -r lib /usr/
sudo cp -r include /usr/

踩坑3:也是耽误我最久的坑!/lib/aarch64-linux-gnu/libc.so.6 version glibc_2.29′ not found

这是由于缺少GLIBC对应版本引起的。笔者一开始是在Ubuntu20.04上编译,复制到Toybrick的Debian10上运行。编译的环境为2.29而运行环境最高只支持到2.28。可以通过如下指令查询GLIBC版本:


strings /lib/aarch64-linux-gnu/libc.so.6 | grep GLIBC

系统对应的GLIBC版本可以在这个网站查询:

Libc6 Download (DEB, RPM) (pkgs.org)

更换为了Ubuntu18.04进行交叉编译,重复步骤3,4,问题解决!

踩坑4:如果使用最新OpenCV4,会报错:fatal error: opencv2/opencv.hpp: No such file or directory

这是由于OpenCV4的文件结构发生了变化。opencv头文件的路径中多了一个opencv4的文件夹:/usr/include/opencv4/opencv2。旧版本是/usr/include/opencv2

  • 可以将opencv2拷贝到自己的include文件夹
  • 可以将opencv2文件夹链接到include文件夹下,进行如下操作:
sudo ln -s /usr/include/opencv4/opencv2 /usr/include/

最后附上成功运行的结果!

参考:

Linux交叉编译opencv并移植ARM端

https://zhuanlan.zhihu.com/p/381760569

在ubuntu下编译opencv程序后,执行报下面到错误: error while loading shared libraries: libopencv_core.so.2.4: cannot op

https://blog.csdn.net/u010925447/article/details/72998414

Problema – GLIBC_2.29 not found – Actualiza tu sistema

https://www.youtube.com/watch?v=Ozz23mg4wOM

linux libc 2.23.so,解决 /lib64/libc.so.6: version `GLIBC_2.14′ not found 的问题

https://blog.csdn.net/weixin_28728443/article/details/116893934?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522164264199616780271556554%2522%252C%2522scm%2522%253A%252220140713.130102334.pc%255Fall.%2522%257D&request_id=164264199616780271556554&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2~all~first_rank_ecpm_v1~rank_v31_ecpm-6-116893934.first_rank_v2_pc_rank_v29&utm_term=%2Flib%2Faarch64-linux-gnu%2Flibc.so.6+version+glibc_2.28+not+found&spm=1018.2226.3001.4187

【opencv4】——fatal error: opencv2/opencv.hpp: No such file or directory #include <opencv2/opencv.hpp>

https://blog.csdn.net/u011622208/article/details/115208377
显示评论 (0)

文章评论

相关推荐

Yolov5_Seg输出解析

通过矩阵乘法(在代码中称为“matmul”)来计算分割掩码的原因,主要与实例分割网络(例如 YOLOv5 Segmentation)的实现方式有关。这种方法实际上是一种高效的特征图与目标分割系数组合的…

Ubuntu交叉编译Python

在 Ubuntu 上交叉编译 Python 的流程通常用于为不同平台生成可执行文件(如 ARM、MIPS 等)。以下是一般的操作步骤: 1. 安装必要的依赖工具 首先,确保已经安装了编译所需的工具和依…