用于Raspberry Pi和BeagleBone Black的交叉编译OpenCV 4

大家好

当我想在树莓派上为一个项目安装OpenCV时,我对结果感到非常失望。 事实证明,对于具有Python3.7支持的Raspbian映像的新版本,不可能使用熟悉的pip install命令从存储库中安装该库。

原因
pip install opencv-python给我一个意想不到的结果:“找不到满足要求的版本...”。 就在最近,我以这种方式在主计算机上安装了该库,结果是肯定的。

当我仔细检查自己的曲率并确保我仍然能够正确键入25个字符的命令而没有错别字时,是时候找出其他可能影响结果的时候了。

pypi.org上的opencv-python官方页面已经阐明了很多:
...请注意,wheel(尤其是许多Linux)格式目前不正确支持ARM体系结构,因此PyPI中没有用于基于ARM的平台的软件包。 但是,可以从www.piwheels.org找到Raspberry Pi的opencv-python软件包。

...请注意,wheel格式(尤其是许多Linux)当前不正确支持ARM体系结构,因此PyPI没有针对基于ARM的平台的软件包。 但是,可以在www.piwheels.org上找到Raspberry Pi的opencv-python软件包。
好吧...

我检查了树莓是否从正确的来源提取数据包,但该站点的最后一块将所有内容都放在了适当的位置:
所提供的车轮支持所有Raspberry Pi型号(Pi 3,Pi 2,Pi 1和Pi Zero)。 为Raspbian Jessie(Python 3.4)和Raspbian Stretch(Python 3.5)提供了轮子。 我们计划在适当的时候增加对Raspbian Buster(Python 3.7)的支持。

提供的轮子支持所有Raspberry Pi型号(Pi 3,Pi 2,Pi 1和Pi Zero。轮子支持Raspbian Jessie(Python 3.4)和Raspbian Stretch(Python 3.5)。我们计划在适当的时候增加对Raspbian Buster(Python 3.7)的支持。
我已经准备好在树莓派上使用OpenCV编译来度过一个不眠之夜,但是我想起了有关交叉编译库的文章 (该学院的老师建议我们做一个实验室而不是手册不是毫无道理的)。 从文章中稍微更改了参数(有必要为python3添加import并检查所有库是否都适用于OpenCV 4.1.0),我可以实现所需的结果。

但是,懒惰开始了,我开始寻找现成的解决方案来解决这一问题。 所以我碰到了这篇文章。 跟随她,我第一次收集了所有东西,而没有铃鼓和其他萨满教仪式。 我认为本文将对其他人有用。

我提供Paul Silisteanu的文章“ 为Raspberry Pi和BeagleBone Black交叉编译OpenCV 4 ”的免费翻译。 也许有人会节省几分钟或几个小时,而这些时间或时间可以花在比玩侦探故事更有趣的课程上。

从我本人那里,我在翻译中添加了一些笔记,我认为这些笔记很重要:[ 它们在文本中突出显示 ]。

享受阅读!

用于Raspberry Pi和BeagleBone Black的交叉编译OpenCV 4


在本文中,我将向您展示如何使用交叉编译为Raspberry Pi和BeagleBone Black安装最新版本的OpenCV 。 在撰写本文时(翻译时的更新为2019年7月17日 ),OpenCV的最新版本为4.1.0,标准OS随附的版本为3.2.0。 当然,可以将OpenCV从源代码直接编译为Raspberry或BeagleBone Black,但这可能需要几个小时。 而为armhf交叉编译OpenCV的过程将持续20-30分钟。 并且,取决于您计算机的速度,它可能甚至更快。

我建议在Debian Buster虚拟机或Docker容器中进行构建,以免干扰您的主操作系统。 如果您决定在虚拟机上安装Buster,请确保使用最低版本 [ 我建议这样做-我在自己的皮肤上检查了它 ]。 从一个简单的系统开始非常重要,因为我们需要安装armhf可执行文件和库。 使用最小的系统,我们避免了与本机x86-64版本的潜在冲突。

本文介绍了只能在具有Raspbian系统的Raspberry PI上工作,但是如果使用BeagleBone Black,则所有工作都应该完全相同。

我假设您已经安装了干净的Raspbian 。 我使用了最新的可用桌面版本的图像。 实际上,您可以按照Raspbian Lite上的文章进行操作,但是我使用GUI版本进行了所有测试。

首先,让我们确保虚拟机或容器已更新:

sudo apt update sudo apt upgrade 

接下来,您需要连接armhf体系结构。

 sudo dpkg --add-architecture armhf sudo apt update sudo apt install qemu-user-static 

此时,您可以在系统上安装armhf的库和应用程序并运行它们。

我们将使用对Python和C ++的支持来构建OpenCV。 让我们为它们安装Python2和Python3以及NumPy协定:

 sudo apt-get install python3-dev sudo apt-get install python3-numpy sudo apt-get install python-dev sudo apt-get install python-numpy 

对于armhf体系结构,我们还将需要libpython:

 sudo apt-get install libpython2-dev:armhf sudo apt-get install libpython3-dev:armhf 

接下来,我们将安装libgtk-3以便能够使用图形界面编写简单的程序。 如果计划仅在脱机模式下使用OpenCV,则可以安全地忽略以下两个库:

 $ sudo apt install libgtk-3-dev:armhf libcanberra-gtk3-dev:armhf 

我们还需要安装OpenCV所需的其他几个库(支持各种图像和视频格式):

 sudo apt install libtiff-dev:armhf zlib1g-dev:armhf sudo apt install libjpeg-dev:armhf libpng-dev:armhf sudo apt install libavcodec-dev:armhf libavformat-dev:armhf libswscale-dev:armhf libv4l-dev:armhf sudo apt-get install libxvidcore-dev:armhf libx264-dev:armhf 

接下来,我们将为Debian安装交叉编译器,该交叉编译器可用于为Raspberry Pi创建armhf二进制文件:

 sudo apt install crossbuild-essential-armhf sudo apt install gfortran-arm-linux-gnueabihf 

在撰写本文时,上述工具包基于GCC 8.3版,与Raspbian中的相同。

最后,我们将安装Cmakegitpkg-config和wget:

 sudo apt install cmake git pkg-config wget 

接下来,我们可以下载当前版本的OpenCV。 我将向您展示如何安装完整版本的OpenCV(默认库和contrib库):

 cd ~ mkdir opencv_all && cd opencv_all wget -O opencv.tar.gz https://github.com/opencv/opencv/archive/4.1.0.tar.gz tar xf opencv.tar.gz wget -O opencv_contrib.tar.gz https://github.com/opencv/opencv_contrib/archive/4.1.0.tar.gz tar xf opencv_contrib.tar.gz rm *.tar.gz 

我们需要临时更改成功构建GTK +支持所需的两个系统变量:

 export PKG_CONFIG_PATH=/usr/lib/arm-linux-gnueabihf/pkgconfig:/usr/share/pkgconfig export PKG_CONFIG_LIBDIR=/usr/lib/arm-linux-gnueabihf/pkgconfig:/usr/share/pkgconfig 

目前,我们可以使用Cmake生成OpenCV构建脚本:

 cd opencv-4.1.0 mkdir build && cd build cmake -D CMAKE_BUILD_TYPE=RELEASE \ -D CMAKE_INSTALL_PREFIX=/opt/opencv-4.1.0 \ -D CMAKE_TOOLCHAIN_FILE=../platforms/linux/arm-gnueabi.toolchain.cmake \ -D OPENCV_EXTRA_MODULES_PATH=~/opencv_all/opencv_contrib-4.1.0/modules \ -D OPENCV_ENABLE_NONFREE=ON \ -D ENABLE_NEON=ON \ -D ENABLE_VFPV3=ON \ -D BUILD_TESTS=OFF \ -D BUILD_DOCS=OFF \ -D PYTHON2_INCLUDE_PATH=/usr/include/python2.7 \ -D PYTHON2_LIBRARIES=/usr/lib/arm-linux-gnueabihf/libpython2.7.so \ -D PYTHON2_NUMPY_INCLUDE_DIRS=/usr/lib/python2/dist-packages/numpy/core/include \ -D PYTHON3_INCLUDE_PATH=/usr/include/python3.7m \ -D PYTHON3_LIBRARIES=/usr/lib/arm-linux-gnueabihf/libpython3.7m.so \ -D PYTHON3_NUMPY_INCLUDE_DIRS=/usr/lib/python3/dist-packages/numpy/core/include \ -D BUILD_OPENCV_PYTHON2=ON \ -D BUILD_OPENCV_PYTHON3=ON \ -D BUILD_EXAMPLES=OFF .. 

参数说明
CMAKE_INSTALL_PREFIX-收集的数据将位于的目录
CMAKE_TOOLCHAIN_FILE-参数显示Cmake什么是交叉编译
OPENCV_EXTRA_MODULES_PATH-其他OpenCV模块的路径
OPENCV_ENABLE_NONFREE = ON-在程序集中包含获得专利的算法
请注意,专利限制适用于SIFT和SURF算法的使用。 而且,如果您打算将其组装用于商业用途,请考虑是否需要它们,并检查限制条件。
ENABLE_NEON = ON-启用NEON指令以优化ARM
ENABLE_VFPV3 = ON-启用VFPv3-D32指令以优化ARM
BUILD_TESTS = OFF-禁用构建测试的规则(将会更快)
BUILD_DOCS = OFF-禁用建筑文件规则
PYTHON2_INCLUDE_PATH-python2.7的路径
PYTHON2_LIBRARIES-先前下载的libpython2库的路径
PYTHON2_NUMPY_INCLUDE_DIRS-用于python2.7的NumPy的路径
PYTHON3_INCLUDE_PATH-python3的路径
PYTHON3_LIBRARIES-先前下载的libpython3库的路径
PYTHON3_NUMPY_INCLUDE_DIRS-python3的NumPy的路径
BUILD_OPENCV_PYTHON2 = ON-在程序集中包含python2的规则
BUILD_OPENCV_PYTHON3 = ON-在程序集中包含python4的规则
BUILD_EXAMPLES = OFF-禁用用于组装所有示例的规则

如果没有错误,则结果将在程序集文件夹中收到一个Makefile。 现在我们可以开始实际构建:

 make -j16 

[ 本文指出了组装过程中的16个并行进程,但需要为您的主机OS选择此参数 ]

构建阶段完成后,我们可以安装该库:

 sudo make install/strip 

然后,我们需要更改该库的名称,尽管实际上它是armhf,但安装程序将其错误地称为x86_64库:

 cd /opt/opencv-4.1.0/lib/python3.7/dist-packages/cv2/python-3.7/ sudo cp cv2.cpython-37m-x86_64-linux-gnu.so cv2.so 

让我们压缩安装文件夹并将存档保存在主目录中:

 cd /opt tar -cjvf ~/opencv-4.1.0-armhf.tar.bz2 opencv-4.1.0 cd ~ 

为了使我们的生活更轻松,我还准备了一个简单的pkg-config设置文件opencv.pc。 您可以通过以下方式下载它:

 git clone https://gist.github.com/sol-prog/ed383474872958081985de733eaf352d opencv_cpp_compile_settings cd opencv_cpp_compile_settings cp opencv.pc ~ cd ~ 

[ 实际上,没有必要在主机上执行此操作。 您可以将文件直接下载到Raspberry。 但作者希望按此顺序进行 ]

opencv.pc
由于文件相对较小,因此让我将其插入文章的文本中:

 libdir = /opt/opencv-4.1.0/lib includedir = /opt/opencv-4.1.0/include/opencv4 Name: OpenCV Description: OpenCV (Open Source Computer Vision Library) is an open source computer vision and machine learning software library. Version: 4.1.0 Libs: -L${libdir} -lopencv_aruco -lopencv_bgsegm -lopencv_bioinspired -lopencv_calib3d -lopencv_ccalib -lopencv_core -lopencv_datasets -lopencv_dnn_objdetect -lopencv_dnn -lopencv_dpm -lopencv_face -lopencv_features2d -lopencv_flann -lopencv_freetype -lopencv_fuzzy -lopencv_gapi -lopencv_hfs -lopencv_highgui -lopencv_imgcodecs -lopencv_img_hash -lopencv_imgproc -lopencv_line_descriptor -lopencv_ml -lopencv_objdetect -lopencv_optflow -lopencv_phase_unwrapping -lopencv_photo -lopencv_plot -lopencv_quality -lopencv_reg -lopencv_rgbd -lopencv_saliency -lopencv_shape -lopencv_stereo -lopencv_stitching -lopencv_structured_light -lopencv_superres -lopencv_surface_matching -lopencv_text -lopencv_tracking -lopencv_videoio -lopencv_video -lopencv_videostab -lopencv_xfeatures2d -lopencv_ximgproc -lopencv_xobjdetect -lopencv_xphoto Cflags: -I${includedir} -lopencv_bgsegm -lopencv_bioinspired -lopencv_calib3d -lopencv_ccalib -lopencv_core -lopencv_datasets -lopencv_dnn_objdetect -lopencv_dnn -lopencv_dpm -lopencv_face -lopencv_features2d -lopencv_flann -lopencv_freetype -lopencv_fuzzy -lopencv_gapi -lopencv_hfs -lopencv_highgui -lopencv_imgcodecs -lopencv_img_hash -lopencv_imgproc libdir = /opt/opencv-4.1.0/lib includedir = /opt/opencv-4.1.0/include/opencv4 Name: OpenCV Description: OpenCV (Open Source Computer Vision Library) is an open source computer vision and machine learning software library. Version: 4.1.0 Libs: -L${libdir} -lopencv_aruco -lopencv_bgsegm -lopencv_bioinspired -lopencv_calib3d -lopencv_ccalib -lopencv_core -lopencv_datasets -lopencv_dnn_objdetect -lopencv_dnn -lopencv_dpm -lopencv_face -lopencv_features2d -lopencv_flann -lopencv_freetype -lopencv_fuzzy -lopencv_gapi -lopencv_hfs -lopencv_highgui -lopencv_imgcodecs -lopencv_img_hash -lopencv_imgproc -lopencv_line_descriptor -lopencv_ml -lopencv_objdetect -lopencv_optflow -lopencv_phase_unwrapping -lopencv_photo -lopencv_plot -lopencv_quality -lopencv_reg -lopencv_rgbd -lopencv_saliency -lopencv_shape -lopencv_stereo -lopencv_stitching -lopencv_structured_light -lopencv_superres -lopencv_surface_matching -lopencv_text -lopencv_tracking -lopencv_videoio -lopencv_video -lopencv_videostab -lopencv_xfeatures2d -lopencv_ximgproc -lopencv_xobjdetect -lopencv_xphoto Cflags: -I${includedir} -lopencv_reg -lopencv_rgbd -lopencv_saliency -lopencv_shape -lopencv_stereo -lopencv_stitching -lopencv_structured_light -lopencv_superres -lopencv_surface_matching -lopencv_text -lopencv_tracking -lopencv_videoio -lopencv_video -lopencv_videostab -lopencv_xfeatures2d -lopencv_ximgproc -lopencv_xobjdetect libdir = /opt/opencv-4.1.0/lib includedir = /opt/opencv-4.1.0/include/opencv4 Name: OpenCV Description: OpenCV (Open Source Computer Vision Library) is an open source computer vision and machine learning software library. Version: 4.1.0 Libs: -L${libdir} -lopencv_aruco -lopencv_bgsegm -lopencv_bioinspired -lopencv_calib3d -lopencv_ccalib -lopencv_core -lopencv_datasets -lopencv_dnn_objdetect -lopencv_dnn -lopencv_dpm -lopencv_face -lopencv_features2d -lopencv_flann -lopencv_freetype -lopencv_fuzzy -lopencv_gapi -lopencv_hfs -lopencv_highgui -lopencv_imgcodecs -lopencv_img_hash -lopencv_imgproc -lopencv_line_descriptor -lopencv_ml -lopencv_objdetect -lopencv_optflow -lopencv_phase_unwrapping -lopencv_photo -lopencv_plot -lopencv_quality -lopencv_reg -lopencv_rgbd -lopencv_saliency -lopencv_shape -lopencv_stereo -lopencv_stitching -lopencv_structured_light -lopencv_superres -lopencv_surface_matching -lopencv_text -lopencv_tracking -lopencv_videoio -lopencv_video -lopencv_videostab -lopencv_xfeatures2d -lopencv_ximgproc -lopencv_xobjdetect -lopencv_xphoto Cflags: -I${includedir} 


将opencv-4.1.0-armhf.tar.bz2和opencv.pc从您的主文件夹复制到RPi。

在本文的下一部分中,我假设您已经在Raspberry Pi上进行了所有操作

确保您的RPi具有我们使用的所有开发库。 和以前一样,如果您不打算使用GTK +,请忽略以下命令的第一行。 如果您使用的是Raspbian的完整版本,则其中的大多数库都应该已经安装:

 sudo apt install libgtk-3-dev libcanberra-gtk3-dev sudo apt install libtiff-dev zlib1g-dev sudo apt install libjpeg-dev libpng-dev sudo apt install libavcodec-dev libavformat-dev libswscale-dev libv4l-dev sudo apt-get install libxvidcore-dev libx264-dev 

解压缩库并将其移动到RPi的/ opt文件夹:

 tar xfv opencv-4.1.0-armhf.tar.bz2 sudo mv opencv-4.1.0 /opt 

如果需要,可以删除存档:

 rm opencv-4.1.0-armhf.tar.bz2 

接下来,我们还将opencv.pc移至pkg-config可以找到它的文件夹:

 sudo mv opencv.pc /usr/lib/arm-linux-gnueabihf/pkgconfig 

为了使操作系统能够找到OpenCV库,我们需要将它们添加到库路径中:

 echo 'export LD_LIBRARY_PATH=/opt/opencv-4.1.0/lib:$LD_LIBRARY_PATH' >> .bashrc source .bashrc 

注销并登录或重新启动终端。

接下来,创建一些符号链接,这些链接将允许Python加载新创建的库:

 sudo ln -s /opt/opencv-4.1.0/lib/python2.7/dist-packages/cv2 /usr/lib/python2.7/dist-packages/cv2 sudo ln -s /opt/opencv-4.1.0/lib/python3.7/dist-packages/cv2 /usr/lib/python3/dist-packages/cv2 

此时,您可以使用C ++或Python中的OpenCV库。
在本文的存储库中,您可以找到一些使用C ++和Python编写的测试程序。 您可以使用以下命令在Pi上下载代码:

 git clone https://github.com/sol-prog/raspberry-pi-opencv.git cd raspberry-pi-opencv/tests 

即使没有将显示器连接到RPi,也可以使用两个独立测试:cli_cpp_test.cpp和cli_python_test.py。 我还包括两个需要显示的图形测试:gui_cpp_test.cpp和gui_python_test.py。

您可以按照以下步骤创建和运行C ++测试:

 g++ cli_cpp_test.cpp -o cli_cpp_test `pkg-config --cflags --libs opencv` ./cli_cpp_test 

而且,如果您的RPi连接了显示器:

 g++ gui_cpp_test.cpp -o gui_cpp_test `pkg-config --cflags --libs opencv` ./gui_cpp_test 

这是在我的Pi上运行的C ++ GUI测试的屏幕截图:



对于Python测试,请使用:

 python3 cli_python_test.py 



 python3 gui_python_test.py 

注意,还可以在Debian x86-64系统上使用OpenCV交叉编译C ++程序,并在RPi上运行二进制代码。

[ 在本文的其他部分,作者建议阅读Derek Molloy的有关RaspberryPi编程的书。 您可以在原始文章 ]中找到该书的推荐链接
链接到原始文章

我自己的一小部分
我准备了一个Dockerfile,可让您执行本文中的所有步骤,而无需部署虚拟机。

安装过程:
创建一个Dockerfile。

 mkdir opencv && cd opencv && mkdir armhf_opencv touch armhf_opencv/Dockerfile nano armhf_opencv/Dockerfile 

接下来,将代码插入Dockerfile中,然后我们开始映像的组装。

 docker image build armhf_opencv/ 

构建完成后,您应该看到组合图像的标识符:

 >>> Successfully built babdc99ba2d8 

我们使用此标识符为图像设置标签并运行它:

 docker tag babdc99ba2d8 armhf_opencv:latest docker run armhf_opencv 

启动容器后,有必要从中抽出收集的档案和opencv.pc文件。 为此,我们需要其标识符:

 docker container ls --all >>> CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES >>> 369dff5a0a9b armhf_opencv "bash" 9 seconds ago Exited (0) 7 seconds ago affectionate_wu 

将我们需要的文件复制到当前目录:

 docker cp 369dff5a0a9b:/root/opencv-4.1.0-armhf.tar.bz2 ./ docker cp 369dff5a0a9b:/root/opencv.pc ./ 

之后,我建议删除该图像,因为它占用了2.5GB的空间。

在我的i59600K(16GB)上通过docker构建大约需要30-40分钟,并且花了很多时间从存储库下载数据。

此外,Raspberry Pi上的安装过程与本文中描述的过程相同。

Dockerfile本身:

 FROM debian:buster USER root RUN apt update && apt upgrade RUN dpkg --add-architecture armhf && \ apt update && apt install -y qemu-user-static RUN apt install -y python3-dev python3-numpy python-dev python-numpy RUN apt install -y libpython2-dev:armhf libpython3-dev:armhf \ libgtk-3-dev:armhf libcanberra-gtk3-dev:armhf \ libtiff-dev:armhf zlib1g-dev:armhf \ libjpeg-dev:armhf libpng-dev:armhf \ libavcodec-dev:armhf libavformat-dev:armhf \ libswscale-dev:armhf libv4l-dev:armhf \ libxvidcore-dev:armhf libx264-dev:armhf RUN apt install -y crossbuild-essential-armhf gfortran-arm-linux-gnueabihf RUN apt install -y cmake git pkg-config wget RUN mkdir opencv_all && cd opencv_all && \ wget -O opencv.tar.gz https://github.com/opencv/opencv/archive/4.1.0.tar.gz && \ tar -xf opencv.tar.gz -C /tmp && \ wget -O opencv_contrib.tar.gz https://github.com/opencv/opencv_contrib/archive/4.1.0.tar.gz && \ tar -xf opencv_contrib.tar.gz -C /tmp && \ rm *.tar.gz && \ export PKG_CONFIG_PATH=/usr/lib/arm-linux-gnueabihf/pkgconfig:/usr/share/pkgconfig && \ export PKG_CONFIG_LIBDIR=/usr/lib/arm-linux-gnueabihf/pkgconfig:/usr/share/pkgconfig && \ cd /tmp/opencv-4.1.0 && mkdir build && cd build && \ cmake -D CMAKE_BUILD_TYPE=RELEASE \ -D CMAKE_INSTALL_PREFIX=/opt/opencv-4.1.0 \ -D CMAKE_TOOLCHAIN_FILE=../platforms/linux/arm-gnueabi.toolchain.cmake \ -D OPENCV_EXTRA_MODULES_PATH=/tmp/opencv_contrib-4.1.0/modules \ -D OPENCV_ENABLE_NONFREE=ON \ -D ENABLE_NEON=ON \ -D ENABLE_VFPV3=ON \ -D BUILD_TESTS=OFF \ -D BUILD_DOCS=OFF \ -D PYTHON2_INCLUDE_PATH=/usr/include/python2.7 \ -D PYTHON2_LIBRARIES=/usr/lib/arm-linux-gnueabihf/libpython2.7.so \ -D PYTHON2_NUMPY_INCLUDE_DIRS=/usr/lib/python2/dist-packages/numpy/core/include \ -D PYTHON3_INCLUDE_PATH=/usr/include/python3.7m \ -D PYTHON3_LIBRARIES=/usr/lib/arm-linux-gnueabihf/libpython3.7m.so \ -D PYTHON3_NUMPY_INCLUDE_DIRS=/usr/lib/python3/dist-packages/numpy/core/include \ -D BUILD_OPENCV_PYTHON2=ON \ -D BUILD_OPENCV_PYTHON3=ON \ -D BUILD_EXAMPLES=OFF .. && \ make -j6 && make install/strip RUN cd /opt/opencv-4.1.0/lib/python3.7/dist-packages/cv2/python-3.7/ && \ cp cv2.cpython-37m-x86_64-linux-gnu.so cv2.so RUN cd /opt && tar -cjvf /root/opencv-4.1.0-armhf.tar.bz2 opencv-4.1.0 RUN git clone https://gist.github.com/sol-prog/ed383474872958081985de733eaf352d opencv_cpp_compile_settings && \ cd opencv_cpp_compile_settings && \ cp opencv.pc /root/ 

Source: https://habr.com/ru/post/zh-CN461693/


All Articles