rpi4b 64bit编译opencv-4.5.0

Raspberry Pi 4B编译opencv-4.5.0

编译平台RPI4B 2G版本,系统版本:“Linux raspberrypi 5.4.73-v8+ #1360 SMP PREEMPT Thu Oct 29 16:00:37 GMT 2020 aarch64 GNU/Linux”
准备编译的目标是opencv最新的4.5.0.如果不到gstreamer和ffmpeg安装,在处理视频流时很难用硬件加速来编解码。所以最好的办法时安装这两个工具。其中gstreamer在nvidia jetson平台上也被经常使用。所以在RPI4B上尽量安装

部分参考Install OpenCV 4.3.0 on Raspberry 64 OS,非常感谢。

提前准备

当然一切开始之前要:

sudo apt update
sudo apt upgrade

1. 安装和编译ffmpeg

这一步最复杂。需要先安装和编译很多依赖库,但也是所有可以成功的前提。

1.1 安装依赖项

sudo apt-get -y install \
autoconf \
automake \
build-essential \
cmake \
doxygen \
git \
graphviz \
imagemagick \
libasound2-dev \
libass-dev \
libavcodec-dev \
libavdevice-dev \
libavfilter-dev \
libavformat-dev \
libavutil-dev \
libfreetype6-dev \
libgmp-dev \
libmp3lame-dev \
libopencore-amrnb-dev \
libopencore-amrwb-dev \
libopus-dev \
librtmp-dev \
libsdl2-dev \
libsdl2-image-dev \
libsdl2-mixer-dev \
libsdl2-net-dev \
libsdl2-ttf-dev \
libsnappy-dev \
libsoxr-dev \
libssh-dev \
libssl-dev \
libtool \
libv4l-dev \
libva-dev \
libvdpau-dev \
libvo-amrwbenc-dev \
libvorbis-dev \
libwebp-dev \
libx264-dev \
libx265-dev \
libxcb-shape0-dev \
libxcb-shm0-dev \
libxcb-xfixes0-dev \
libxcb1-dev \
libxml2-dev \
lzma-dev \
meson \
nasm \
pkg-config \
python3-dev \
python3-pip \
texinfo \
wget \
yasm \
zlib1g-dev

1.2 安装和编译fdk-aac,dav1d,kvazaar,libvpx,aom,zimg

这几个库的作用自己查找,其实我也不太懂。这几个库我自己不太建议用git clone的方式。
原因是会下载很多其他版本的源文件。最重要的是,你可以通过自己的PC使用之后下载这几个库,成功率比较高。否则,在没有配置的情况下。很可能卡在这一步很长时间。
注意以下操作步骤都在假定你已经解压了下载的文件(解压命令很简单 tar -xzvf *.tar.bz),并且已经进入了解压之后的目录里面。
下文全用make -j2,其实可以用j4但是为了稳健。
1.2.1 #AAC: fdk-aac
地址:https://github.com/mstorsjo/fdk-aac
编译步骤// 先configure,然后make,最后安装:

autoreconf -fiv
./configure
make -j2
sudo make install

1.2.2 #AV1: dav1d
地址:https://code.videolan.org/videolan/dav1d
编译步骤// 建目录,meson配置,ninja编译,安装:

mkdir build && cd build
meson ..
ninja
sudo ninja install

1.2.3 #HEVC: kvazaar
地址:https://github.com/ultravideo/kvazaar
编译步骤:

./autogen.sh
./configure
make -j2
sudo make install

1.2.4 #VP8 and VP9: libvpx
地址:https://chromium.googlesource.com/webm/libvpx
编译步骤:

 ./configure --disable-examples --disable-tools --disable-unit_tests --disable-docs
 make -j2
 sudo make install

1.2.5 #AP1: aom
地址:https://aomedia.googlesource.com/aom
这个下载的未知不太好找,需要方可。
编译步骤:

mkdir aom_build && cd aom_build
cmake -G "Unix Makefiles" AOM_SRC -DENABLE_NASM=on -DPYTHON_EXECUTABLE="$(which python3)" ..
make -j2
sudo make install

1.2.6 #zimg: zimg
地址:https://github.com/sekrit-twc/zimg
编译步骤:

sh autogen.sh
./configure
make
sudo make install

1.3 编译ffmpeg

最关键的步骤到了,在ffmpeg官网下载源代码。
然后解压,进入目录。
1.3.1 配置

./configure \
    --extra-cflags="-I/usr/local/include" \
    --extra-ldflags="-L/usr/local/lib" \
    --extra-libs="-lpthread -lm -latomic" \
    --arch=aarch64 \
    --enable-gmp \
    --enable-gpl \
    --enable-libaom \
    --enable-libass \
    --enable-libdav1d \
    --enable-libfdk-aac \
    --enable-libfreetype \
    --enable-libmp3lame \
    --enable-libopencore-amrnb \
    --enable-libopencore-amrwb \
    --enable-libopus \
    --enable-librtmp \
    --enable-libsnappy \
    --enable-libsoxr \
    --enable-libssh \
    --enable-libvorbis \
    --enable-libvpx \
    --enable-libwebp \
    --enable-libx264 \
    --enable-libx265 \
    --enable-libxml2 \
    --enable-omx-rpi\
    --enable-nonfree \
    --enable-omx \
    --enable-omx-rpi \
    --enable-version3 \
    --target-os=linux \
    --enable-pthreads \
    --enable-openssl \
    --enable-hardcoded-tables \
    --enable-shared \
    --enable-pic \
    --disable-static

1.3.2 make和安装

make -j2
sudo make install

中间可能会出错,删除目录重试一遍。

2. 安装gstreamer

安装过程相对简单:

sudo apt install libgstreamer0.10-0  libgstreamer1.0-dev libgstreamer1.0-0-dbg  \
libgstreamermm-1.0-1 libgstreamermm-1.0-dev  libgstrtspserver-1.0-0  \
libgstrtspserver-1.0-0-dbg libgstrtspserver-1.0-dev libgstreamer-gl1.0-0  \
libgstreamer-ocaml libgstreamer-ocaml-dev libgstreamer-opencv1.0-0  \
libgstreamer-plugins-base1.0-0 libgstreamer-plugins-base1.0-dev  \
gstreamer1.0-x gstreamer1.0-tools gstreamer1.0-vaapi gstreamer1.0-rtsp \
gstreamer1.0-rtsp-dbg gstreamer1.0-pipewire gstreamer1.0-packagekit \
gstreamer1.0-opencv gstreamer1.0-gl gstreamer1.0-libav gstreamer1.0-libav-dbg  \
gstreamer1.0-plugins-base gstreamer1.0-plugins-base-apps gstreamer1.0-plugins-base-dbg \
gstreamer1.0-nice gstreamer1.0-omx-generic gstreamer1.0-omx-generic-config  \
gstreamer1.0-omx-generic-dbgsym gstreamer1.0-espeak gstreamer1.0-alsa \
gstreamer1.0-adapter-pulseeffects gstreamer1.0-convolver-pulseeffects \
gstreamer1.0-crystalizer-pulseeffects gstreamer1.0-plugins-good gstreamer1.0-plugins-rtp \
gstreamer1.0-plugins-good-dbg gstreamer1.0-pocketsphinx gstreamer1.0-pulseaudio \
gir1.2-gstreamer-1.0 \
gstreamer1.0-gtk3 \
gstreamer1.0-plugins-good \
gstreamer1.0-plugins-good-dbg \
libges-1.0-0 \
libges-1.0-dev \
libges-1.0-0-dbg \
libnice-dev 

其实也可以安装更多的,比如:
gstreamer1.0-python3-dbg-plugin-loader
gstreamer1.0-python3-plugin-loader

3. 安装其它一些重要的库

尽量安装python3,当然build-essential,cmake, pkgconffig之类的是必须的。

sudo apt install build-essential cmake git unzip pkg-config  python3-dev python3-numpy python3-pip
sudo apt-get install libjpeg-dev libpng-dev \
libavcodec-dev libavformat-dev libswscale-dev \
libgtk2.0-dev libcanberra-gtk* libgtk-3-dev \
libxvidcore-dev libx264-dev \
python3-dev python3-numpy python3-pip \
libtbb2 libtbb-dev libdc1394-22-dev \
libv4l-dev v4l-utils \
libopenblas-dev libatlas-base-dev libblas-dev \
liblapack-dev gfortran libhdf5-dev \
libprotobuf-dev libgoogle-glog-dev libgflags-dev \
protobuf-compiler

最好安装ccache

4. 最好扩展swap空间

sudo nano /etc/dphys-swapfile
# 在文档中更改并保存退出重启
CONF_SWAPSIZE=2048

CMAKE流程

下载release的zip文件,不建议clone。那样文件太大了。然后unzip。
为了路径比较干净,而且方便管理(删除错误),一般要新建一个build目录。

mkdir Workspace && cd Workspace
mkdir cv45 && mv cv45
unzip ~/Downloads/opencv-4.5.0.zip
unzip ~/Downloads/opencv_contrib-4.5.0.zip
cd opencv-4.5.0
mkdir build
cd build 

注意64位和32位还是有一些不同的,这里提供我自己的64bit配置信息。(主要时VPF3问题)
为了避免1301错误,我通常会事先建议一个.cache目录.并将文件解压到.cache文件中

mkdir ../.cache
cd ../.cache
unzip ~/Downloads/xfeatures.zip
#检查一下拷贝的目录和文件是否正确,注意文件大小不能是0.
ls xfeatures2d
ls -al  xfeatures2d/boostdesc/  
ls -al xfeatures2d/vgg
cd ../build

这样就可以

cmake -D CMAKE_BUILD_TYPE=RELEASE \
        -D CMAKE_INSTALL_PREFIX=/usr/local \
        -D OPENCV_EXTRA_MODULES_PATH=/home/pi/Workspace/cv45/opencv_contrib-4.5.0/modules \
        -D ENABLE_NEON=ON \
        -D WITH_FFMPEG=ON \
        -D WITH_GSTREAMER=ON \
        -D WITH_TBB=ON \
        -D BUILD_TBB=ON \
        -D BUILD_TESTS=OFF \
        -D WITH_EIGEN=OFF \
        -D WITH_V4L=ON \
        -D WITH_LIBV4L=ON \
        -D WITH_VTK=OFF \
        -D WITH_QT=OFF \
        -D OPENCV_ENABLE_NONFREE=ON \
        -D INSTALL_C_EXAMPLES=OFF \
        -D INSTALL_PYTHON_EXAMPLES=OFF \
        -D BUILD_NEW_PYTHON_SUPPORT=ON \
        -D BUILD_opencv_python3=TRUE \
        -D OPENCV_GENERATE_PKGCONFIG=ON \
        -D BUILD_EXAMPLES=OFF ..

MAKE流程

make -j3

一般情况下cmake步骤如果完全通过,并且检查完毕,这一步通常很简单。

1、 libavsample的问题

但是还是会遇到一些问题。在cmake阶段,我的遇到了缺少libavsample的问题,但是当时没注意。结果在编译的过程中提示以下错误(不要看编译最后,一般问题出现之后还要完成余下的一部分编译工作,然后中断。所以要往前提前看一下):

/usr/bin/ld: error: /usr/local/lib/libavformat.a: ELF section name out of range
collect2: error: ld returned 1 exit status
make[2]: *** [modules/videoio/CMakeFiles/opencv_videoio.dir/build.make:359: lib/libopencv_videoio.so.4.5.0] Error 1
make[1]: *** [CMakeFiles/Makefile2:4698: modules/videoio/CMakeFiles/opencv_videoio.dir/all] Error 2
make[1]: *** Waiting for unfinished jobs....

导致这个问题的原因是ffmpeg,在编译配置的时候没有使用–enable-shared 和 --enable-pic.有两个办法是一个是关闭ffmpeg,一个是重新配置ffmpeg并编译。但是需要注意的是如果你确定以后不会用到ffmpeg的话,再关闭。否则只能迎难而上。

2、最常见的1301错误

这个在各个版本中都经常出现。解决办法请参见我的另一篇更早的博客文章。
解决办法也可以在哪里找到。原因就是因为网络原因,下载出现了问题。这里的工作就是提前在.cache里面放入这几个文件。

3、最最常见的问题

当使用make -j4甚至make -j2的时候会出现编译到8x%甚至100%的时候卡滞。没关系,当卡滞时间超过20分钟,就果断停止。为了保证之前的cmake不会重复做。可以在上一步就把build目录备份一下,这时候把build清空,然后把备份的文件复原之后。在make一遍。注意这时候就不要make -jx了。直接用make。你会发现因为make -j4过之后,很多文件已经就绪。这时候尽管只用make,速度也飞起来。甚至二十分钟以内就可以完成剩余工作。尽管如此,但还是要在最后100%的时候保持耐心。这一步耗费的时间甚至超过前面所有的时间。这时候一定要耐心。如果有所担心,在make之前,先把rpi关闭几分钟,散一下热量。
耐心很重要,但是我自己的耐心不够。在数次主动中断之后,我决定去跑了个步。你猜怎么着,半个小时之后,一切ok。

SUDO MAKE INSTALL

这个没什么好说的,安装要是root权限。
安装安装完成重建链接sudo ldconfig
安装完成之后要检查一下:

pkg-config --cflags --libs opencv4

如果安装完成应该有回应告知配置信息。
编译的时候也编译了python3的库,此时你也可以通过它来尝试。

import cv2
cv2.__version__
print(cv2.getBuildInformation())

你可能感兴趣的:(日积月累计划,raspberry,pi,raspberry,pi,opencv,ffmpeg,gstreamer)