写在前面

  • 若不关心 OpenCV 版本,可使用 apt 方式安装,本处不再赘述。
  • 执行本篇每一个步骤前,推荐先执行 mkdir 新建文件夹后进入文件夹操作。

下载 OpenCV 源代码

OpenCV 源代码分为两部分,其中可选安装拓展算法 opencv_contrib。

OpenCV: https://github.com/opencv/opencv/releases

OpenCV_Contrib: https://github.com/opencv/opencv_contrib/releases

若直接使用 wget 下载可能会遇到下载速度过慢的问题,可以考虑在电脑上下载完成后使用 U 盘或 Samba 传输到树莓派。

下载完成后将两个文件解压到同一目录备用。此处以文章发布时 OpenCV 最新版本(4.5.2)为例。

$ cd ~
$ mkdir opencv_build && cd opencv_build
$ wget https://github.com/opencv/opencv/archive/refs/tags/4.5.2.zip
$ wget https://github.com/opencv/opencv_contrib/archive/refs/tags/4.5.2.zip
$ unzip opencv-4.5.2.zip
$ unzip opencv_contrib-4.5.2.zip
$ cd opencv-4.5.2

安装依赖

首先更新软件源并执行清理。

$ sudo apt update && sudo apt upgrade -y
$ sudo apt-get dist-upgrade -y --autoremove

然后安装编译所需依赖。

$ sudo apt install -y \
        build-essential \
        cmake \
        git \
        pkg-config
$ sudo apt install -y \
    gfortran \
    libatlas-base-dev \
    liblapacke-dev \
    liblapack-dev \
    libavcodec-dev \
    libavformat-dev \
    libswscale-dev \
    libv4l-dev \
    v4l-utils \
    libxvidcore-dev \
    libx264-dev \
    libfontconfig1-dev \
    libcairo2-dev \
    libgdk-pixbuf2.0-dev \
    libpango1.0-dev \
    libgtk2.0-dev \
    libgtk-3-dev \
    libcanberra-gtk3* \
    libhdf5-dev \
    libhdf5-serial-dev \
    libhdf5-103 \
    libqtgui4 \
    libqtwebkit4 \
    libqt4-test \
    python3-pyqt5 \
        libgstreamer1.0-dev \
        libgstreamer-plugins-base1.0-dev \
    libjpeg-dev \
    libtiff-dev \
    libpng-dev \
    libjasper-dev \
    libtbb-dev \
    libtbb2 \
    python3-dev \
    python3-pip \
    python3-numpy

最后修复可能出错的安装。

$ sudo apt install -f

调整 swap 分区大小

在下一步的编译 OpenCV 中,由于树莓派的内存和 CPU 限制,cmake 可能会在编译至 100% 处时卡顿很久直到被系统杀死。解决的思路有两种,一种是利用 PC 机交叉编译(事实上 OpenCV 也推荐我们这样做,他们不推荐在任何嵌入式设备上进行编译),或是临时扩展 swap 分区大小。

当设备的物理内存用完时,操作系统将使用交换空间。尽管交换内存比物理内存慢很多,但在某些情况下它仍然很有用。首先打开 /etc/dphys-swapfile 修改交换文件配置。

$ sudo nano /etc/dphys-swapfile

在此文件中,找到 CONF_SWAPSIZE ,修改后面的数值为 2048 。

CONF_SWAPSIZE=2048

接着按下 CTRL+X ,输入 y 并回车,保存并退出。

最后重启交换文件服务。

$ sudo systemctl restart dphys-swapfile

开始编译 & 安装

首先回到第一步解压源码的目录,并进入 OpenCV 源码文件夹。创建并进入新文件夹后开始准备编译。新建 build 文件夹的目的是为了将源码和 cmake 产生的文件区分开来,以便编译错误后能很方便的删除缓存重新编译。

$ mkdir build && cd build

接着执行 cmake 。

  • CMAKE_INSTALL_PREFIX 是最终OpenCV的安装位置
  • OPENCV_ENABLE_NONFREE 指示是否开启Non-free的算法
  • OPENCV_EXTRA_MODULES_PATH 指示扩展算法的源码文件夹

同时注意以下命令的输出,可以从中找到哪些模块没有配置成功。

$ cmake -D CMAKE_BUILD_TYPE=RELEASE \
      -D CMAKE_INSTALL_PREFIX=/usr/local/opencv4.5.2 \
      -D OPENCV_EXTRA_MODULES_PATH=/home/dimoj/opencv_build/opencv_contrib-4.5.2/modules \
      -D BUILD_EXAMPLES=OFF \
      -D BUILD_TESTS=OFF \
      -D BUILD_PERF_TESTS=OFF \
      -D INSTALL_PYTHON_EXAMPLES=OFF \
      -D INSTALL_C_EXAMPLES=OFF \
      -D ENABLE_NEON=ON \
      -D ENABLE_VFPV3=ON \
      -D OPENCV_ENABLE_NONFREE=ON \
      -D CMAKE_SHARED_LINKER_FLAGS=-latomic \
      -D WITH_FFMPEG=ON \
      -D WITH_TBB=ON \
      -D BUILD_TBB=ON \
      -D WITH_GSTREAMER=ON \
      -D WITH_V4L=ON \
      -D WITH_LIBV4L=ON \
      -D BUILD_NEW_PYTHON_SUPPORT=ON \
      -D ENABLE_PRECOMPILED_HEADERS=ON \
      -D OPENCV_GENERATE_PKGCONFIG=ON ..

使用 make 开始编译源码,-j 后接的参数代表线程数,树莓派 3B+ 推荐 4 线程。

$ make -j4

待 make 执行完毕后,执行 sudo make install 开始安装。

$ sudo make install

至此,安装完成。

为 IDE 指定动态链接库路径

完成以上安装后,直接使用 cmake 编译源码能够成功运行,但在 IDE (例如 visual studio code )中则会在运行时报错。

error while loading shared libraries: libopencv_core.so.2.4: cannot open shared object file: No such file or directory

这是因为编译器自己找不到安装后的 OpenCV 库的路径,所以需要告诉系统到指定的地方链接。sudo 编辑(或新建) /etc/ld.so.conf.d/opencv.conf 。

$ sudo nano /etc/ld.so.conf.d/opencv.conf

加上动态链接库的位置(即上述 cmake 中参数 CMAKE_INSTALL_PREFIX 指定的路径中的 lib 文件夹)

/usr/local/opencv4.5.2/lib

接着按下 CTRL+X ,输入 y 并回车,保存并退出。

最后检查动态链接库是否生效。

$ sudo ldconfig -v

检查输出中是否有 OpenCV 路径。

发表评论

您的电子邮箱地址不会被公开。 必填项已用*标注