树莓派4B Linux opencv4 源码编译安装(各种踩坑)

目录

说明

1.换源

2.扩展储存空间和交换空间

3.下载相关工具包

4.编译OpenCV(多坑警告)

6.安装与验证

7.收尾


说明

第一次接触在Linux上安装opencv,失败过几次,就用了pip安装方式,确实简单很多,但是为了深入的学习,还是决定使用源码编译一次,把安装成功的详细过程,方便自己和他人的参考,希望对你能有帮助。

如果你还不熟悉Linux的基本操作,最好了解一下 Linux命令行 和 vim 的使用基础,这里不再解释。

 

1.换源

(1)这基本是学习Linux的常识吧,因为默认源是外国的网站,下载速度奇慢,我用的清华源,其他源也可以自己多尝试。

编辑 `/etc/apt/sources.list` 文件,删除原文件所有内容,用以下内容取代:
pi # sudo vim /etc/apt/sources.list
deb http://mirrors.tuna.tsinghua.edu.cn/raspbian/raspbian/ buster main non-free contrib rpi
deb-src http://mirrors.tuna.tsinghua.edu.cn/raspbian/raspbian/ buster main non-free contrib rpi


编辑 `/etc/apt/sources.list.d/raspi.list` 文件,删除原文件所有内容,用以下内容取代:
pi # sudo /etc/apt/sources.list.d/raspi.list
deb http://mirrors.tuna.tsinghua.edu.cn/raspberrypi/ buster main ui

需要注意的是:

  • 直接删除源文件内容的方式简单粗暴,不可取,不过这种东西基本改一次就不会动了,所有不需多在意。
  • “ pi # ”是为了模拟Linux shell环境,和内容部分做区分,初学者直接复制“#”以后的内容即可,不带“#”即为需要写入文件的内容。
  • 清华源官方说明地址:https://mirror.tuna.tsinghua.edu.cn/help/raspbian/

 

(2)更新软件

pi # sudo apt-get update
pi # sudo apt-get upgrade

需要注意的是:

  • 如果你的系统不是最新的,那么第二条命令可能会稍微耗时一点,但这是十分必要的。

 

2.扩展储存空间和交换空间

(1)用SD卡安装完系统后一大部分空间实际是未被分配的,所以我们需要利用好全部的扩展空间。

pi # sudo raspi-config

然后进入一个软件工具界面,找到下图对应的选项,回车

图3

在这里插入图片描述

然后系统会提示你重启,重启即可。这样就利用好了全部的内存卡储存空间。

 

(2)增加交换空间以避免因内存问题导致的编译挂起

pi # sudo vim /etc/dphys-swapfile

将 CONF_SWAPSIZE 值从默认值更改 100 为 1024 :

保存退出后,运行一下命令:

pi # sudo /etc/init.d/dphys-swapfile restart

 

3.下载相关工具包

(1)opencv强大不光是本身厉害,还需要各种相关库的支持。

pi # sudo apt install build-essential cmake git pkg-config libgtk-3-dev libcanberra-gtk*
pi # sudo apt install libavcodec-dev libavformat-dev libswscale-dev libv4l-dev libxvidcore-dev libx264-dev
pi # sudo apt install libjpeg-dev libpng-dev libtiff-dev gfortran openexr libatlas-base-dev opencl-headers
pi # sudo apt install python3-dev python3-numpy libtbb2 libtbb-dev libdc1394-22-dev

这里就会体现出换源后的速度优势。

 

(2)而opencv的源码因为只能在GitHub上下载,速度会很慢,这里提供了官方下载地址和一个4.4版本的网盘链接。

在用户目录下创建新的文件夹用来放置源码,源码可以克隆git上最新的,也可以去文末的网盘链接里找。

pi # mkdir ~/opencv_build && cd ~/opencv_build
pi # git clone https://github.com/opencv/opencv.git
pi # git clone https://github.com/opencv/opencv_contrib.git

链接:https://pan.baidu.com/s/100jhcxX0AwgK40iqduvEGw   提取码:fu3b 

 

(3)此外,我们还需要一个用来构建源码编译的目录:

pi # mkdir -p ~/opencv_build/opencv/build

至此,我们的准备工作完成,如果你到这里运行的还算顺畅,那么接下来,可能会让你有一点头疼。

 

4.编译OpenCV(多坑警告)

这是最耗时,也最容易出错的一部分,下面的操作可能与你在其他地方看到的不太一样,这是因为里面解决了一些我遇到的坑。

(1)做一个注释,排除anaconda对过程的影响。

pi # export PATH=~/anaconda3/bin:$PATH

 

(2)执行cmake

pi # cd ~/opencv_build/opencv/build
pi # cmake -D CMAKE_BUILD_TYPE=RELEASE \
    -D CMAKE_INSTALL_PREFIX=/usr/local \
    -D INSTALL_C_EXAMPLES=OFF \
    -D INSTALL_PYTHON_EXAMPLES=OFF \
    -D OPENCV_GENERATE_PKGCONFIG=ON \
    -D ENABLE_NEON=ON \
    -D ENABLE_VFPV3=ON \
    -D BUILD_TESTS=OFF \
    -D OPENCV_ENABLE_NONFREE=ON \
    -D OPENCV_EXTRA_MODULES_PATH=~/opencv_build/opencv_contrib/modules \
    -D BUILD_EXAMPLES=OFF \
	-D WITH_OPENMP=ON ..

需要注意的是:

  • 确保目录在~/opencv_build/opencv/build
  • 确保第 11 行opencv_contrib路径的正确
  • “\” 代表将代码延续到下一行,所有这一长串cmake其实是一个操作

 

(3)当看到如下结果时,代表你成功了

...
-- Configuring done
-- Generating done
-- Build files have been written to: /home/pi/opencv_build/opencv/build

 

(4)接下来是应该执行make了

pi # sudo make -j4
  • -j4代表使用4核编译,千万不要超过芯片的实际核心。
  • 这里树莓派4大概需要1-2个小时,耐心等待,不要做其他操作
  • 编译过程会出现大量的绿色代码、白色代码并显示进度。

 

(5)注意:可能会在编译过程中遇到报错,停止编译,这里千万不要慌张,往回翻错误类型,并百度你遇到的问题。

这里我放一个我遇到的问题(原谅我没有截图),大概率你也会遇到,提示缺少  某.i  文件。

下载文件地址:链接:https://pan.baidu.com/s/1cxESlWhS1l80iyaSX739Qw   提取码:unu3 

把缺少的文件拷贝到:~/opencv_build/opencv_contrib//modules/xfeatures2d/src/

切换回 ~/opencv_build/opencv/build 输入 make 继续执行即可。

 

6.安装与验证

到这里你已经完成了99%的工作,和最难的部分。

安装

pi # sudo make install

时间很快,结果如下:

...
-- Installing: /usr/local/bin/opencv_version
-- Set runtime path of "/usr/local/bin/opencv_version" to "/usr/local/lib"

验证

pi # python

>import cv2

如果没有报错,那么恭喜你,你已经完成了。

 

7.收尾

大量交换使用可能会损坏您的 SD 卡。将交换空间更改回原始大小:

pi # sudo nano /etc/dphys-swapfile

将 CONF_SWAPSIZE 值改回 100

保存文件并激活更改:

pi # sudo /etc/init.d/dphys-swapfile restart

enjoy

你可能感兴趣的:(python,linux,opencv)