Open CV是啥我觉得不用说多说了,如果你点进这篇博客我相信你知道它是干嘛的。事实上我只在树莓派上用过Open CV一次,其中还有个有趣的事情。

大概是在19年的春天,那时候我已经辞职在家,考完了托福等着出国了。当时从公司离职没啥钱,就在贴吧发帖接毕设,然后还真有人找我。当时那个人在做一个监控系统,代码是抄的,然后他遇到一个问题不会解决。他想把摄像头拍的照片实时显示在屏幕上,我一听这简单啊,搭起运行环境直接调用树莓派上的显示图片的程序显示,当时就加了一行代码,拿了100块。过了一天吧,他又要在开机的时候加一段视频,我直接调用VLC实现了这个,又是一行代码100块。前前后后大概给他解决了五、六个问题,差不多都是一行100块吧,最后我都不好意思了,他还有问题但是我没继续给他搞。也就是在那个时候我才开始研究怎么装Open CV,但是到目前为止我还是在研究生的时候用过一点Open CV,写了个车牌识别的代码,就像这种:

开玩笑的啦,正经的车牌号。

废话不多说,进入正题:

步骤

更新系统

惯例,在开始安装之前先更新一下系统:

sudo apt-get update
sudo apt-get upgrade

安装必要的软件

sudo apt install cmake build-essential libgtk2.0-dev pkg-config

在此,如果你的树莓派没有安装git的话还需要安装git。

安装图片和视频库

sudo apt install libjpeg-dev libtiff-dev libjasper-dev libpng-dev libwebp-dev libopenexr-dev
sudo apt install libavcodec-dev libavformat-dev libswscale-dev libv4l-dev libxvidcore-dev libx264-dev libdc1394-22-dev libgstreamer-plugins-base1.0-dev libgstreamer1.0-dev

安装计算库

sudo apt install libatlas-base-dev liblapacke-dev gfortran

这里,ATLAS是一个数值计算优化软件,在矩阵求解方面很常用。libpack是一个线性代数库,支持并行计算,我之前在上班的时候用过这个,功能很多,但是也很复杂,没记错的话是用Fortran写的。gfortran不用说了,是Fortran编译器。Fortran是一门很古老的语言,长于矩阵计算,跟matlab语法类似,计算矩阵的时候基本不需要for循环,直接计算就可以,在数值计算方面用处很多,我本人现在也是以Fortran为主力语言。

安装HDF5支持库

sudo apt install libhdf5-dev libhdf5-103

HDF5在遥感领域很常用,我之前用过一次。

安装python库

sudo apt install python3-dev python3-pip python3-numpy

这个只是以防万一,前两个应该都有,但是还是运行一下,反正有的话也不会再装一遍。

编译前准备

在开始编译之前,我们需要扩展以下swap区。当然,如果你用的是树莓派4B的话应该不需要。

sudo nano /etc/dphys-swapfile

找到如下内容:

CONF_SWAPSIZE=100

替换成:

CONF_SWAPSIZE=2048

完成后,crtl+x,之后按下y,最后回车退出。

重启服务,使修改生效:

sudo systemctl restart dphys-swapfile

下载Open CV的repo:

git clone https://github.com/opencv/opencv.git
git clone https://github.com/opencv/opencv_contrib.git
cd opencv

编译

创建一个名为build的文件夹:

mkdir build
cd build

使用如下命令在build目录生成makefile:

cmake -D CMAKE_BUILD_TYPE=RELEASE \
    -D CMAKE_INSTALL_PREFIX=/usr/local \
    -D OPENCV_EXTRA_MODULES_PATH=~/opencv_contrib/modules \
    -D ENABLE_NEON=ON \
    -D ENABLE_VFPV3=ON \
    -D BUILD_TESTS=OFF \
    -D INSTALL_PYTHON_EXAMPLES=OFF \
    -D OPENCV_ENABLE_NONFREE=ON \
    -D CMAKE_SHARED_LINKER_FLAGS=-latomic \
    -D BUILD_EXAMPLES=OFF ..

在成功创建makefile之后,我们使用如下命令编译:

make -j$(nproc)

这个-j$(nproc)选项是什么意思呢?-j是指定编译过程中使用多少个进程,这个在编译大型工程时非常实用,我之前上班时基本都用44个进程编,速度杠杠的。这个命令能有效避免一核有难,八方围观的尴尬。

make完成之后,紧接着使用如下命令安装:

sudo make install
sudo ldconfig

说白了,安装其实就是把这个加到系统路径中去,让系统调用的时候能找到这个文件。

安装完成后,把swap大小改回来,因为swap区用的是tf卡,太大的话,会占用存储空间。

打开如下文件:

sudo nano /etc/dphys-swapfile

找到:

CONF_SWAPSIZE=2048

替换为:

CONF_SWAPSIZE=100

完成后,crtl+x,之后按下y,最后回车退出。

重启服务以生效:

sudo systemctl restart dphys-swapfile

测试

测试很简单,就是通过Python的import命令,如果不报错就说明安装成功:

python3

在Python的命令提示符中,输入:

import cv2

没报错的话就成功了,我们顺便看下版本:

cv2.__version__

如果没问题的话你能看到如下版本号(版本号可能更大,视具体安装日期而定):

'4.1.2'
最后修改日期:2020年5月10日

作者

留言

发表评论