在运行Raspbian Stretch的Raspberry Pi 3上安装OpenCV 3
如果您曾经在Raspberry Pi(或之前的任何其他平台)上安装过OpenCV,那么您知道该进程可能非常耗时且需要安装许多依赖项和先决条件。本教程的目标是引导您逐步完成编译和安装过程。
为了使安装过程更加顺利,我将每个步骤的时间安排在一起,以便您在Pi编译OpenCV时知道何时休息一下,喝杯咖啡并检查电子邮件。
让我们继续,开始在运行Raspbian Stretch的Raspberry Pi 3上安装OpenCV 3。
步骤1:展开文件系统
您是否使用全新的Raspbian Stretch安装?
如果是这样,你应该做的第一件事是扩展你的文件系统,以包括你的micro-SD卡上的所有可用空间:
1
|
$
sudo
raspi
-
config
|
|
然后选择“高级选项”菜单项:
接下来选择“扩展文件系统”:
然后重新启动Pi - 可能会提示您重新启动,但如果不是,则可以执行:
1
|
$
sudo
reboot
|
重新启动后,您的文件系统应该已经扩展到包含micro-SD卡上的所有可用空间。您可以验证该盘已被执行扩展 DF - ^ h 和检查的输出:
1
2
3
4
5
6
7
8
9
10
|
$
df
-
h
Filesystem
Size
Used
Avail
Use
%
Mounted
on
/
dev
/
root
30G
4.2G
24G
15
%
/
devtmpfs
434M
0
434M
0
%
/
dev
tmpfs
438M
0
438M
0
%
/
dev
/
shm
tmpfs
438M
12M
427M
3
%
/
run
tmpfs
5.0M
4.0K
5.0M
1
%
/
run
/
lock
tmpfs
438M
0
438M
0
%
/
sys
/
fs
/
cgroup
/
dev
/
mmcblk0p1
42M
21M
21M
51
%
/
boot
tmpfs
88M
0
88M
0
%
/
run
/
user
/
1000
|
正如你所看到的,我的Raspbian文件系统已经扩展到包含所有32GB的micro-SD卡。
但是,即使扩展了我的文件系统,我也已经使用了32GB卡的15%。
如果您使用的是8GB存储卡,则可能会占用50%的可用空间,所以一件简单的事情就是删除LibreOffice和Wolfram引擎,以释放Pi上的一些空间:
1
2
3
4
|
$
sudo
apt
-
get
purge
wolfram
-
engine
$
sudo
apt
-
get
purge
libreoffice
*
$
sudo
apt
-
get
clean
$
sudo
apt
-
get
autoremove
|
删除Wolfram引擎和LibreOffice后,您可以回收近1GB!
步骤#2:安装依赖关系
这并不是我第一次讨论如何在Raspberry Pi上安装OpenCV,因此我将简要介绍这些说明,以便您完成安装过程:我还包括了时间它需要执行每个命令(一些取决于您的Internet速度),因此您可以相应地规划OpenCV + Raspberry Pi 3的安装(OpenCV本身需要大约4个小时才能编译 - 稍后会有更多内容)。
第一步是更新和升级任何现有的软件包:
1
|
$
sudo
apt
-
get
update
&&
sudo
apt
-
get
upgrade
|
时间:2分14秒
然后,我们需要安装一些开发工具,包括CMake,它可以帮助我们配置OpenCV构建过程:
1
|
$
sudo
apt
-
get
install
build
-
essential
cmake
pkg
-
config
|
时机:19秒
接下来,我们需要安装一些图像I / O包,允许我们从磁盘加载各种图像文件格式。这种文件格式的例子包括JPEG,PNG,TIFF等:
1
|
$
sudo
apt
-
get
install
libjpeg
-
dev
libtiff5
-
dev
libjasper
-
dev
libpng12
-
dev
|
时机:21秒
就像我们需要图像I / O包一样,我们也需要视频I / O包。这些库允许我们从磁盘读取各种视频文件格式,并直接处理视频流:
1
2
|
$
sudo
apt
-
get
install
libavcodec
-
dev
libavformat
-
dev
libswscale
-
dev
libv4l
-
dev
$
sudo
apt
-
get
install
libxvidcore
-
dev
libx264
-
dev
|
时机:32s
OpenCV库附带一个名为highgui的子模块 ,用于在我们的屏幕上显示图像并构建基本的GUI。为了编译 highgui模块,我们需要安装GTK开发库:
1
|
$
sudo
apt
-
get
install
libgtk2
.
0
-
dev
libgtk
-
3
-
dev
|
时间:1分36秒
OpenCV中的许多操作(即矩阵操作)可以通过安装一些额外的依赖关系进一步优化:
1
|
$
sudo
apt
-
get
install
libatlas
-
base
-
dev
gfortran
|
时机:23秒
这些优化库对于资源受限设备(如Raspberry Pi)尤为重要。
最后,让我们安装Python 2.7和Python 3头文件,以便我们可以用Python绑定来编译OpenCV:
1
|
$
sudo
apt
-
get
install
python2
.
7
-
dev
python3
-
dev
|
时间:45s
如果您正在全新安装操作系统,那么这些版本的Python可能已经是最新版本了(您会看到终端消息指出了这一点)。
步骤#3:下载OpenCV源代码
现在我们已经安装了依赖项,让我们从官方的OpenCV仓库中获取OpenCV 的 3.3.0归档。这个版本包含了 我们在之前的文章中讨论过的 dnn模块,我们使用OpenCV进行了深度学习(注意:随着未来版本的openCV的发布,您可以用最新版本号替换 3.3.0):
1
2
3
|
$
cd
~
$
wget
-
O
opencv
.zip
https
:
/
/
github
.com
/
Itseez
/
opencv
/
archive
/
3.3.0.zip
$
unzip
opencv
.zip
|
时机:41秒
我们需要完整安装 OpenCV 3(例如,可以访问SIFT和SURF等功能),因此我们还需要获取opencv_contrib存储库:
1
2
|
$
wget
-
O
opencv_contrib
.zip
https
:
/
/
github
.com
/
Itseez
/
opencv_contrib
/
archive
/
3.3.0.zip
$
unzip
opencv_contrib
.zip
|
时机:37s
在复制和粘贴期间,您可能需要使用“<=>”按钮来扩展上面的命令。OpenCV 3.3.0归档的完整URL是:
https://github.com/Itseez/opencv_contrib/archive/3.3.0.zip
注意:确保您的 opencv和 opencv_contrib版本相同。如果版本号不匹配,那么您可能会遇到编译时错误或运行时错误。
步骤#4:Python 2.7或Python 3?
在我们开始在我们的Raspberry Pi 3上开始编译OpenCV之前,我们首先需要安装 Python包管理器pip:
1
2
3
|
$
wget
https
:
/
/
bootstrap
.pypa
.io
/
get
-
pip
.py
$
sudo
python
get
-
pip
.py
$
sudo
python3
get
-
pip
.py
|
时机:33秒
您可能会收到一条消息,指出在发出这些命令时pip已经是最新的,但最好不要跳过这一步。
如果你是一个长期的PyImageSearch读者,那么你就会知道,我是一个巨大的风扇两者的virtualenv和virtualenvwrapper。安装这些软件包并不是必需的,你绝对可以在没有它们的情况下安装OpenCV,但是,我强烈建议你安装它们,因为其他现有的PyImageSearch教程(以及未来的教程)也可以利用Python虚拟环境。我也会假设你已经在本指南的其余部分安装了virtualenv和 virtualenvwrapper。
那么,鉴于此,使用 virtualenv和 virtualenvwrapper有什么意义?
首先,了解虚拟环境是一种特殊的工具,通过为每个环境创建独立的,独立的 Python环境来保持不同项目所需的依赖关系,这一点很重要。
总之,它解决了“Project X取决于版本1.x,但项目Y需要4.x”的困境。
Python社区的标准做法是使用某种虚拟环境,所以我强烈建议您也这样做:
1
2
|
$
sudo
pip
install
virtualenv
virtualenvwrapper
$
sudo
rm
-
rf
~
/
.cache
/
pip
|
时机:35s
既然 virtualenv和 virtualenvwrapper已经安装好了,我们需要更新我们的文件在文件底部包含以下行:
1
2
3
|
# virtualenv and virtualenvwrapper
export
WORKON_HOME
=
$HOME
/
.virtualenvs
source
/
usr
/
local
/
bin
/
virtualenvwrapper
.sh
|
在之前的教程中,我建议使用您最喜欢的基于终端的文本编辑器(例如 vim, emacs或nano)来更新 配置文件。如果您对这些编辑感到满意,请继续并更新文件以反映上述更改。
否则,您应该简单地使用 cat并输出重定向来处理更新 :
1
2
3
|
$
echo
-
e
"\n# virtualenv and virtualenvwrapper"
>>
~
/
.profile
$
echo
"export WORKON_HOME=$HOME/.virtualenvs"
>>
~
/
.profile
$
echo
"source /usr/local/bin/virtualenvwrapper.sh"
>>
~
/
.profile
|
现在我们有了 配置文件已更新,我们需要重新加载它以确保更改生效。你可以强制重新加载你的 配置文件通过:
- 注销然后重新登录。
- 关闭一个终端实例并打开一个新实例
- 或者我个人最喜欢的,只需使用 source命令:
1
|
$
source
~
/
.profile
|
注:我建议在运行 源〜/ 。 每次打开一个新的终端以确保您的系统变量已正确设置时,这个配置文件就可以被使用。
创建你的Python虚拟环境
接下来,我们来创建我们将用于计算机视觉开发的Python虚拟环境:
1
|
$
mkvirtualenv
cv
-
p
python2
|
该命令将使用Python 2.7创建一个名为cv的新Python虚拟环境 。
如果您不想使用Python 3,则需要使用此命令:
1
|
$
mkvirtualenv
cv
-
p
python3
|
时间:24s
同样,我不能强调这一点就够了:在 CV Python的虚拟环境是完全独立的,隔离来自包括在下载Raspbian拉伸的默认Python版本。全局 中的任何Python软件包软件包目录都不可用于 cv虚拟环境。同样地,安装在任何Python包 。当你在你的Python虚拟环境中工作时,记住这一点,这将有助于避免很多混乱和麻烦。
如何检查您是否在“cv”虚拟环境中
如果你曾经重启你的树莓派; 注销并重新登录; 或者打开一个新的终端,您需要使用 workon命令重新访问 cv虚拟环境。在以前的博客文章中,我已经看到读者使用 mkvirtualenv命令 - 这完全是不必要的!该 mkvirtualenv命令是为了只执行一次:实际上创建虚拟环境。
之后,您可以使用 workon然后将其放入虚拟环境中:
1
2
|
$
source
~
/
.profile
$
workon
cv
|
为了验证并确保你在 虚拟环境中,检查您的命令行- 如果你看到的文字 (CV )提示符之前,那么你是在 CV虚拟环境:
否则,如果你没有看到 (CV )的文本,那么你是不是在 CV虚拟环境:
要解决这个问题,只需执行上面提到的 source和 workon命令即可。
在你的Raspberry Pi上安装NumPy
假设你已经做到了这一点,你现在应该在 cv虚拟环境中(你应该留在本教程的其余部分)。我们唯一的Python依赖是NumPy,一个用于数值处理的Python包:
1
|
$
pip
install
numpy
|
时间:11分12秒
一定要拿一杯咖啡或去散步,NumPy的安装可能需要一些时间。
注意:我经常看到的一个问题是“帮助,我的NumPy安装已经挂起,而且没有安装!”实际上,它正在安装,只需要一段时间就可以停止源代码并进行编译。你可以通过运行top来验证NumPy是否正在编译和安装 。在这里你会看到你的CPU周期正在用于编译NumPy。耐心一点。树莓派不如您的笔记本电脑/台式机。
步骤#5:编译并安装OpenCV
我们现在准备编译和安装OpenCV!通过检查您的提示(您应该看到前面的(cv )文本),仔细检查您是否在 cv虚拟环境中 ,如果没有,请执行 workon:
1
|
$
workon
cv
|
一旦你确定你在 cv虚拟环境中,我们可以使用CMake来设置我们的版本:
1
2
3
4
5
6
7
8
|
$
cd
~
/
opencv
-
3.3.0
/
$
mkdir
build
$
cd
build
$
cmake
-
D
CMAKE_BUILD_TYPE
=
RELEASE
\
-
D
CMAKE_INSTALL_PREFIX
=
/
usr
/
local
\
-
D
INSTALL_PYTHON_EXAMPLES
=
ON
\
-
D
OPENCV_EXTRA_MODULES_PATH
=
~
/
opencv_contrib
-
3.3.0
/
modules
\
-
D
BUILD_EXAMPLES
=
ON
.
.
|
时间:2米56秒
现在,在我们转到实际的编译步骤之前,请确保您检查CMake的输出!
首先向下滚动标题为 Python 2 和 Python 3的部分 。
如果您正在为Python 2.7编译OpenCV 3,请确保您的 Python 2 部分包含解释器, 库,numpy和 包路径的有效路径 ,类似于以下屏幕截图:
注意解释器是如何 指向我们的 python2.7二进制位于 cv虚拟环境中。该 numpy的变量还指出,与NumPy安装在 CV环境。
同样,如果您正在编译Python 3的OpenCV,请确保 Python 3 部分如下图所示:
解释器再次 指向我们的 python3.5二进制位于 cv虚拟环境中,而 numpy指向我们的NumPy安装。
无论哪种情况,如果在这些变量路径中没有看到 cv虚拟环境,那几乎可以肯定是因为在运行CMake之前,您并不在 cv虚拟环境中!
如果是这种情况,请使用workon cv访问 cv虚拟环境, 然后重新运行上述 cmake命令。
编译前配置交换空间大小
在开始编译过程之前,您应该 增加交换空间大小。这使OpenCV能够与 Raspberry PI的所有四个核心进行编译,而不会由于内存问题而停止编译。
打开你的 sudo nano /etc/dphys-swapfile 然后编辑 CONF_SWAPSIZE 变量:
1
2
3
4
|
# set size to absolute value, leaving empty (default) then uses computed value
# you most likely don't want this, unless you have an special disk situation
# CONF_SWAPSIZE=100
CONF_SWAPSIZE
=
1024
|
请注意,我已经注释了100MB行,并添加了1024MB行。这是使用Raspbian Stretch进行多核编译的秘诀。
如果你跳过这一步,OpenCV可能无法编译。
要激活新的交换空间,请重新启动交换服务:
1
2
|
$
sudo
/
etc
/
init
.d
/
dphys
-
swapfile
stop
$
sudo
/
etc
/
init
.d
/
dphys
-
swapfile
start
|
注意:因为闪存的写入次数有限,所以可能会烧毁Raspberry Pi microSD卡,直到卡无法工作为止。这是 强烈建议您更改此设置恢复到默认你完成编译和测试安装(见下文)时。要详细了解破坏内存的交换大小,请参阅此页面。
最后,我们现在准备编译OpenCV:
1
|
$
make
-
j4
|
时间:1小时30分钟
一旦OpenCV 3完成编译,你的输出应该类似于我的下面:
从那里,你需要做的就是在你的Raspberry Pi 3上安装OpenCV 3:
1
2
|
$
sudo
make
install
$
sudo
ldconfig
|
时机:52s
步骤#6:完成在您的Pi上安装OpenCV
我们差不多完成了 - 只需再走几步,您就可以在Raspbian Stretch上使用OpenCV 3的Raspberry Pi 3了。
对于Python 2.7:
如果您的第5步完成没有错误,OpenCV现在应该安装在 /usr/local/lib/python2.7/site-packages/。您可以使用ls命令来验证它 :
1
2
3
|
$
ls
-
l
/
usr
/
local
/
lib
/
python2
.
7
/
site
-
packages
/
total
1852
-
rw
-
r
--
r
--
1
root
staff
1895772
Mar
20
20
:
00
cv2
.so
|
注意:在某些情况下,OpenCV可以安装在 /usr/local/lib/python2.7/dist-packages/(注意 dist - packages而不是 site - packages )。
我们的最后一步是符号链接 OpenCV的绑定到我们的 品种为Python 2.7的虚拟环境:
1
2
|
$
cd
~
/
.virtualenvs
/
cv
/
lib
/
python2
.
7
/
site
-
packages
/
$
ln
-
s
/
usr
/
local
/
lib
/
python2
.
7
/
site
-
packages
/
cv2
.so
cv2
.so
|
对于Python 3:
运行 make install之后,您的OpenCV + Python绑定应安装在/usr/local/lib/python3.5/site-packages。再次,您可以使用ls命令验证这一点 :
1
2
3
|
$
ls
-
l
/
usr
/
local
/
lib
/
python3
.
5
/
site
-
packages
/
total
1852
-
rw
-
r
--
r
--
1
root
staff
1895932
Mar
20
21
:
51
cv2
.cpython
-
34m.so
|
我真的不知道为什么,也许这是CMake脚本中的一个错误,但是在为Python 3+编译OpenCV 3绑定时,输出 。所以文件被命名为 cv2.cpython-35m-arm-linux-gnueabihf.so cv2.so所以(或某种变体)而不是简单的 cv2.so(如在Python 2.7绑定中)。
同样,我不确定发生这种情况的确切原因,但这很容易解决。我们所需要做的就是重命名文件:
1
2
|
$
cd
/
usr
/
local
/
lib
/
python3
.
5
/
site
-
packages
/
$
sudo
mv
cv2
.cpython
-
35m
-
arm
-
linux
-
gnueabihf
.so
cv2
.so
|
我们可以将我们的OpenCV绑定对应到Python 3.5 的 cv虚拟环境中:
1
2
|
$
cd
~
/
.virtualenvs
/
cv
/
lib
/
python3
.
5
/
site
-
packages
/
$
ln
-
s
/
usr
/
local
/
lib
/
python3
.
5
/
site
-
packages
/
cv2
.so
cv2
.so
|
步骤#7:测试你的OpenCV 3安装
恭喜,您现在已经在运行Raspbian Stretch的Raspberry Pi 3上安装了OpenCV 3!
但是在我们捧起香槟喝醉我们的胜利之前,我们先来验证一下你的OpenCV安装是否正常。
打开一个新的终端,执行 source和 workon命令,然后尝试导入Python + OpenCV绑定:
1
2
3
4
5
6
7
|
$
source
~
/
.profile
$
workon
cv
$
python
>>>
import
cv2
>>>
cv2
.__version__
'3.3.0'
>>>
|
从我自己的终端的屏幕截图中可以看到,OpenCV 3已成功安装在Raspberry Pi 3 + Python 3.5环境中:
一旦安装了OpenCV,您可以删除 opencv - 3.3.0和 opencv_contrib - 3.3.0目录以释放磁盘上的一堆空间:
1
|
$
rm
-
rf
opencv
-
3.3.0
opencv_contrib
-
3.3.0
|
但是,请谨慎使用此命令!确保在吹走这些目录之前OpenCV已经正确安装在您的系统上。这里的一个失误就可能花费你时间 在编译的时候。
不要忘记更换你的交换大小!
打开你的 sudo nano /etc/dphys-swapfile 然后编辑 CONF_SWAPSIZE 变量:
1
2
3
4
|
# set size to absolute value, leaving empty (default) then uses computed value
# you most likely don't want this, unless you have an special disk situation
CONF_SWAPSIZE
=
100
# CONF_SWAPSIZE=1024
|
请注意,我已经注释掉了1024MB行,并取消了100MB行的注释。
如果你跳过这一步,你的记忆卡将不会持续很长时间。 如上所述,更大的交换空间可能导致内存损坏,所以我建议将其设置回100MB。
要恢复到较小的交换空间,请重新启动交换服务:
1
2
|
$
sudo
/
etc
/
init
.d
/
dphys
-
swapfile
stop
$
sudo
/
etc
/
init
.d
/
dphys
-
swapfile
start
|