树莓派4B 安装 OPENCV 20200302

疫情影响下,有点闲。游戏打多了自然就会空虚,所以捡起来了丢了很久的点子玩了起来,买了块树莓派4B。差不多10年前(那时候还在读研)买了一块pcDuino,那个时候不知道有没有树莓派了,只觉得这个东西能运行一个系统也挺新奇的,后来也没玩了,现在4B比起来,完全不是一个概念,可玩性高多了,就是比起ARM贵太多了。

因为老婆一天到晚在玩跳跳跳,还放言过500分就有奖励,所以我要用树莓派4B+摄像头+电容笔+电磁阀搞个物理外挂出来(其实用手机+电脑也行,更简单,但没意思)。所以,我需要OPENCV的支持。

但是OPENCV是基于x86的。你也不能指望anaconda有arm的版本(有过,后来没了),所以还得自己编译才能用。参考了很多大神的文章,见下面的连接,但是没有任何一个是完全没问题的,填坑之后,自己总结一番,留个笔记。

本文主要参考了以下5个文章

https://blog.csdn.net/qq_40657528/article/details/103463809

https://github.com/armstrong1972/Install-OpenCV4.1.1-on-RaspberryPi-4b/blob/master/How%20to%20Install%20-%20chn.txt

https://jingyan.baidu.com/article/6b1823090fa81bfa59e1594e.html

https://www.cnblogs.com/gghy/p/11916830.html

https://blog.csdn.net/AlexWang30/article/details/99612188

先说一下我的硬件:树莓派4B,2G运存版本。摄像头是USB摄像头,一查到WINDOWS就自动能装驱动能用那种。TF 16g。

1、树莓派的系统安装

https://www.raspberrypi.org/downloads/raspbian/

我用的是 Raspbian Buster with desktop and recommended software 。这个不会装??请自行度娘。

2、扩充文件系统(不是必须)

我的4B吧镜像烧录到TF的时候就已经是扩充了,所以不一定是必须,但是也写一下吧:

命令行:sudo raspi-config

选择第7个高级选项,接着点击A1 扩充文件系统

重启树莓派

3、换源

命令行:sudo nano /etc/apt/sources.list

如果用不习惯nano ,可以改成 $ sudo mousepad /etc/apt/sources.list,就是用系统自带的记事本打开下同

注释掉原数据行,增加如下2行:

deb http://mirrors.ustc.edu.cn/raspbian/raspbian/buster main contrib non-free rpi
deb-src http://mirrors.ustc.edu.cn/raspbian/raspbian/buster main contrib non-free rpi

请注意一定是要buster。参考文章里面用的是stretch,直接导致了我后面更新失败,提示版本冲突。

4、更新所有的包

$ sudo apt-get update

$ sudo apt-get upgrade

5、安装依赖

cmake:
sudo apt-get install build-essential cmake git pkg-config

安装jpeg格式图像工具包:
sudo apt-get install libjpeg8-dev 

安装tif格式图像工具包
sudo apt-get install libtiff5-dev 

安装JPEG-2000图像工具包
sudo apt-get install libjasper-dev 

安装png图像工具包
sudo apt-get install libpng12-dev 

安装视频库,v4l中4后面的是 英文字母“l”
sudo apt-get install libavcodec-dev libavformat-dev libswscale-dev libv4l-dev

安装GTK2.0
sudo apt-get install libgtk2.0-dev

安装OpenCV数值优化函数包
sudo apt-get install libatlas-base-dev gfortran

6、下载OPENCV代码

https://opencv.org/上面下载即可,要下载opencv_contrib和opencv两个文件,下面是我用的地址

https://codeload.github.com/opencv/opencv_contrib/zip/master
https://codeload.github.com/opencv/opencv/zip/master

推荐用电脑下载。下载完之后解压,推荐放在主工作目录下面,搞一个opencv和opencv_contrib文件夹分别放

7、配置CMake编译OpenCV环境

#具体路径请以实际为准
cd opencv

# 新建build文件夹
mkdir build
      
# 进入build文件夹
cd build

# CMAKE_BUILD_TYPE是编译方式
# CMAKE_INSTALL_PREFIX是安装目录
# OPENCV_EXTRA_MODULES_PATH是加载额外模块
# INSTALL_PYTHON_EXAMPLES是安装官方python例程
# BUILD_EXAMPLES是编译例程(这两个可以不加,不加编译稍微快一点点,想要C语言的例程的话,在最后一行前加参数INSTALL_C_EXAMPLES=ON,要C++例程的话#在最后一行前加参数INSTALL_C_EXAMPLES=ONINSTALL_CXX_EXAMPLES=ON)
 
sudo cmake -D CMAKE_BUILD_TYPE=RELEASE \
    -D CMAKE_INSTALL_PREFIX=/usr/local \
    -D OPENCV_EXTRA_MODULES_PATH=~/opencv_contrib/modules \
    -D INSTALL_PYTHON_EXAMPLES=ON \
    -D INSTALL_CXX_EXAMPLES=ON \
    -D BUILD_EXAMPLES=ON ..

8、为树莓派增加SWAP(4G派可以跳过)

编译过程需要的内存很大,需要配置交换空间的大小,临时改大,编译完之后记得改回来。

打开配置文件:
sudo nano /etc/dphys-swapfile
然后编辑 CONF_SWAPSIZE  变量:
CONF_SWAPSIZE = 2048
重新启动交换服务
sudo /etc/init.d/dphys-swapfile stop
sudo /etc/init.d/dphys-swapfile start

9、编译OPENCV(应该会出错,看下面的步骤)

sudo make -j4 2>&1 | tee make.log
要等大概4h的编译。正常来说直接走到100%就成功了,如果出错的话,去make.log里面看看,通常都会出错。

10、编译过程出错应对

编译过程中会出错。我这边的经验好像是10多个文件会出问题,都是丢失头文件。而实际上,丢失的这些头文件,都是在的,只是位置错了。解决的方法也很简单,首先从log里面找,是在编译什么文件(例如,A.cpp)的时候miss了什么文件(b.h),我们就在这两个目录找b.h文件,然后把它放到A.cpp同一个目录里面,并把A.cpp里面的include 直接从带地址的引用,直接改成不带地址的引用,例如

#include patha/pathb/xxx.h 

改成 

#include xxx.h

当然记得头文件要放在cpp的那个目录。

重新执行make,已经make的他就会跳过,然后继续干。

这些文件好像都是example,也不知道是不是没有人去维护这些旧的文件了。

来来回回这样,我大概搞了7到8次,最终搞到100%。

11、安装和其他设置

// 安装
sudo make install
 
// 更新动态链接库
sudo ldconfig

//这里我使用的是树莓派默认的nano,也可以使用vim、gedit.打开opencv.conf文件
sudo nano /etc/ld.so.conf.d/opencv.conf

/**
*在末端添加如下内容
*注意:?表示一个空格,可能原因是有的语言要求最后有一个空格才可以编译通过。
**/
/usr/local/lib
 //加载一下
sudo ldconfig

//打开bash.bashrc配置文件
sudo gedit /etc/bash.bashrc

// 在最后添加如下内容
PKG_CONFIG_PATH=$PKG_CONFIG_PATH:/usr/local/lib/pkgconfig       
export PKG_CONFIG_PATH

将交换空间改回来!

重启

12、测试OPENCV

import cv2
import numpy as np
cv2.namedWindow("gray")
img = np.zeros((512,512),np.uint8)#生成一张空的灰度图像
cv2.line(img,(0,0),(511,511),255,5)#绘制一条白色直线
cv2.imshow("gray",img)#显示图像
#循环等待,按q键退出
while True:
     key=cv2.waitKey(1)
     if key==ord("q"):
         break
cv2.destoryWindow("gray")

缩进可能要自己改一下,如果能运行就OK了。

13、备份镜像

这么麻烦的东西我是不想搞第二次了,我搞完之后第一时间就是吧TF卡的镜像拷了下来...

后记

跳一跳轻轻松松上了2000分,然并卵,微信识别为作弊(我确实是啊),我用了各种手段都没有办法绕过识别。哎,平时就100分左右,特然玩个2000分,要我我也不信。不过没所谓,老婆那边我是骗到了。

 

你可能感兴趣的:(硬件应用,硬件)