疫情影响下,有点闲。游戏打多了自然就会空虚,所以捡起来了丢了很久的点子玩了起来,买了块树莓派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。
https://www.raspberrypi.org/downloads/raspbian/
我用的是 Raspbian Buster with desktop and recommended software 。这个不会装??请自行度娘。
我的4B吧镜像烧录到TF的时候就已经是扩充了,所以不一定是必须,但是也写一下吧:
命令行:sudo raspi-config
选择第7个高级选项,接着点击A1 扩充文件系统
重启树莓派
命令行: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,直接导致了我后面更新失败,提示版本冲突。
$ sudo apt-get update
$ sudo apt-get upgrade
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
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文件夹分别放
#具体路径请以实际为准
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 ..
编译过程需要的内存很大,需要配置交换空间的大小,临时改大,编译完之后记得改回来。
打开配置文件:
sudo nano /etc/dphys-swapfile
然后编辑 CONF_SWAPSIZE 变量:
CONF_SWAPSIZE = 2048
重新启动交换服务
sudo /etc/init.d/dphys-swapfile stop
sudo /etc/init.d/dphys-swapfile start
sudo make -j4 2>&1 | tee make.log
要等大概4h的编译。正常来说直接走到100%就成功了,如果出错的话,去make.log里面看看,通常都会出错。
编译过程中会出错。我这边的经验好像是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%。
// 安装
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
将交换空间改回来!
重启
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了。
这么麻烦的东西我是不想搞第二次了,我搞完之后第一时间就是吧TF卡的镜像拷了下来...
跳一跳轻轻松松上了2000分,然并卵,微信识别为作弊(我确实是啊),我用了各种手段都没有办法绕过识别。哎,平时就100分左右,特然玩个2000分,要我我也不信。不过没所谓,老婆那边我是骗到了。