目录
1.前言
2.配置内网穿透及远程VNC
3.安装.net core 5
4.安装niginx并配置
5.安装supervisor守护进程
6.安装摄像头相关控件
7.安装OpenCV
8.测试树莓派摄像头
一直都打算将这几年的项目及学习历程整理成一篇篇的文章,善于归纳总结才能走得更远,说做就做,所以就决定每天晚上抽出一部分时间进行自己的学习总结,当然,得等到家里的小屁孩睡着了才能够静下心来慢慢总结整理。
前段时间自己入手了树莓派4B,觉得慢慢学习研究一下,等小屁孩长大了,就可以教他动手制作自己的小玩具耍。经过了两个星期的摸索研究,算是入门了吧,现在把自己的经验总结一下,免得大家走弯路。
工欲善其事必先利其器,所以第一件事就是要启动树莓派,然后配置相关参数,再通过内网穿透,让我们在外网也能够连接到家里的树莓派。安装启动树莓派这个过程我这里就暂且过滤掉,因为这个过程相对简单,具体的操作请看传送门-首次使用树莓派,如何安装、启动及配置
在我们启动好树莓派之后,就需要一个内网穿透工具,经过我面向某度编程之后,找到了一个适合的工具cpolar,用这个工具的主要原因是可以白嫖白嫖白嫖。
1. 首先从官网下载最新的cpolar
wget https://www.cpolar.com/static/downloads/cpolar-stable-linux-arm.zip
2. 解压缩
unzip cpolar-stable-linux-arm.zip
3. 将cpolar命令移到 /usr/local/bin目录
sudo mv cpolar /usr/local/bin
4. cpolar进行token认证
登录到cpolar后台,获取到自己的token值,然后复制到命令中。传送门-cpolar官网
cpolar authtoken Yzhh********************
配置文件会保存在 /home/pi/.cpolar/cpolar.yml,记录下该路径
5. 前台测试
cpolar http 8080
如下图,就说明已经配置好了
命令参数说明
http 意思是创建一个http协议的隧道 8080 指定内网web站点的8080端口,按ctrl+C可退出。
6. 安装及配置vim
如果还没有安装vim,可以先安装
sudo apt install vim
7. 配置vim
我们先对vim做基本配置,目的是为了以防止稍后编辑时,多出TAB键。
vim ~/.vimrc
在配置文件末尾添加如下内容:
set tabstop=2
set softtabstop=2
set shiftwidth=2
set expandtab
8.在cpolar配置文件中,添加ssh内网穿透隧道
除了在cpolar命令行中,我们还可以在配置文件中添加多个隧道。这样多个隧道可以同时启动。 本例中,我们添加一个web隧道,一个ssh隧道
编辑cpolar的配置文件
vim ~/.cpolar/cpolar.yml
在文件下面,我们编辑成如下内容:
authtoken: YzNmYmUzOTctODMxNyxxxxxxxxxxxxxxxxxTZkNjczOGM3
tunnels:
web:
addr: 8080
proto: http
region: cn_vip
ssh:
addr: 22
proto: tcp
region: cn_vip
vnc:
addr: 5900
proto: tcp
region: cn_vip
参数说明,vnc-5900是树莓派远程的协议端口:
authtoken: xxxxx #认证token
tunnels:
web: #隧道名称,用户可以自定义,但多隧道时,不可重复
addr: 8080 #本地Web站点端口
proto: http #协议http
region: cn_vip #地区,cn_vip,可选:us,hk,cn,cn_vip
ssh: #隧道名称,表示ssh,名称可以自定义
addr: 22 #端口号为22
proto: tcp #协议tcp
region: cn_vip #地区,cn_vip,可选:us,hk,cn,cn_vip
注:这里的配置文件是yaml格式,每一级的参数前面,会缩进两个空格,不能使用TAB键,不能使用TAB键,不能使用TAB键。(重要说三遍)
9.测试是否配置成功
cpolar start-all
如果提示某行错误,请根据行号及报错信息修改
10. 后台运行cpolar
nohup cpolar start-all -config=/home/pi/.cpolar/cpolar.yml -log=stdout &
11. 验证后台是否运行正常
ps -aux | grep cpolar | grep -v grep
根据后台的进ID,杀掉后台运行的cpolar进程,本例如图中的28440,即为cpolar的后台进程ID
杀掉cpolar后台进程
kill 28440
12. 配置开机自启动脚本
sudo nano /etc/rc.local
在exit 0前面,加入
nohup cpolar start-all -config=/home/pi/.cpolar/cpolar.yml -log=stdout &
保存退出。快捷按键:ctrl+o enter ctrl+x
13. 重启树莓派
sudo reboot
14. 重启后查看是否成功
ps -aux | grep cpolar | grep -v grep
14. 查看在线隧道
传送门-cpolar官网
由于本人从事的是.net core方向的开发,所以这里就安装的是.net core的环境,因为后续的后台管理系统、接口服务、GPIO控制台程序等等都是基于.net core进行的开发。
下载32位arm架构sdk
wget https://download.visualstudio.microsoft.com/download/pr/55547694-fe7e-43f3-bf58-33ef9bb7ee85/5d8b57df472b96e6f38988041751ba2e/dotnet-sdk-5.0.203-linux-arm.tar.gz
建立存放目录
sudo mkdir /usr/share/dotnet
解压安装
sudo tar -xvf dotnet-sdk-5.0.203-linux-arm.tar.gz -C /usr/share/dotnet
建立软连接
sudo ln -s /usr/share/dotnet/dotnet /usr/bin/dotnet
解决图片验证码显示问题,安装依赖包,这一步主要是后台管理系统里面用了system.drawing类库,安装下面的依赖可以解决系统图片问题。
sudo apt install libc6-dev
sudo apt install libgdiplus
修改目录下所有的文件夹属性为可读可写,主要是解决用pi账户登入后,系统目录不能进行文件写入:
sudo chmod 777 *
我这里是通过niginx对后台管理系统和接口服务进行的一个反向代理,当然,也可以直接上宝塔,简单粗暴,不过我这里尽量减少树莓派开销,就没有用宝塔。
下载nginx
sudo apt-get install nginx
配置代理-以后台管理系统及接口服务为例-暂时未配置SSL
sudo nano /etc/nginx/sites-available/default
server {
listen 8080;
server_name localhost;
location /MiracleInterface {
proxy_pass http://localhost:6000;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection keep-alive;
proxy_set_header Host localhost;
proxy_cache_bypass $http_upgrade;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
}
location / {
proxy_pass http://localhost:5000;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection keep-alive;
proxy_set_header Host localhost;
proxy_cache_bypass $http_upgrade;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
}
}
重新加载
sudo /etc/init.d/nginx reload
sudo /etc/init.d/nginx start
下载
sudo apt install supervisor
应用配置
在 /etc/supervisor/conf.d 中创建 xxx.conf,每个应用对应一个配置文件即可
授权可进行文件写入
cd /etc/supervisor/conf.d
sudo chmod 777 /etc/supervisor/conf.d
创建文件
sudo nano AdminMS.conf
sudo nano WebAPI.conf
sudo nano FaceRead.conf
示例:
[program:AdminMS] ;程序的名称
command = dotnet MiracleAdminMS.Web.Entry.dll ;执行的命令
directory = /home/pi/web/webadmin/ ;命令执行的目录
user = root ;执行进程的用户
stopsignal = INT
autostart = true ;是否自动启动
autorestart = true ;是否自动重启
startsecs = 3 ;自动重启间隔
stderr_logfile = /var/log/helloworld.err.log ;标准错误日志
stdout_logfile = /var/log/helloworld.out.log ;标准输出日志
我的树莓派实际配置如下:
web后台管理系统:
[program:AdminMS] ;
command = dotnet MiracleAdminMS.Web.Entry.dll ;
directory =/home/pi/WebPublish/WebAdmin/ ;
user = pi ;
stopsignal = INT
autostart = true ;
autorestart = true ;
startsecs = 3 ;
stderr_logfile = /home/pi/WebPublish/WebAdmin/AdminMS.err.log ;
stdout_logfile = /home/pi/WebPublish/WebAdmin/AdminMS.out.log ;
webapi接口服务:
[program:WebAPI] ;
command = dotnet MiracleAdminMS.WebAPI.Entry.dll ;
directory =/home/pi/WebPublish/WebAPI/ ;
user = pi ;
stopsignal = INT
autostart = true ;
autorestart = true ;
startsecs = 3 ;
stderr_logfile = /home/pi/WebPublish/WebAPI/WebAPI.err.log ;
stdout_logfile = /home/pi/WebPublish/WebAPI/WebAPI.out.log ;
自动化读取人脸抓拍数据:
[program:FaceRead] ;
Command =
python3 /home/pi/WebPublish/AutoFaceCheckPythonProject/03_face_recognition.py ;
directory =/home/pi/WebPublish/AutoFaceCheckPythonProject/ ;
user = pi ;
stopsignal = INT
autostart = true ;
autorestart = true ;
startsecs = 3 ;
stderr_logfile = /home/pi/WebPublish/WebAPI/FaceRead.err.log ;
stdout_logfile = /home/pi/WebPublish/WebAPI/FaceRead.out.log ;
重启 supervisor
sudo supervisorctl reload
或热重启,不会重启其他子进程
sudo supervisorctl reread
sudo supervisorctl update
为确保没有错误,可以正常启动,使用前文提到的查看supervisor状态的命令查看。或者查看要管理的进程是否启动,本例中可以使用下面的命令:
ps -ef | grep AdminMS
ps -ef | grep WebAPI
关闭所有任务
supervisorctl shutdown
查看进程:
sudo supervisorctl status
重启进程:
sudo supervisorctl restart AdminMS
停止进程:
sudo supervisorctl stop AdminMS
启动进程:
sudo supervisorctl start AdminMS
重载进程:
sudo supervisorctl reload
在某些时候,我们可以开启8080端口:
sudo iptables -I INPUT -i eth0 -p tcp --dport 8080 -j ACCEPT
sudo iptables -I OUTPUT -o eth0 -p tcp --sport 8080 -j ACCEPT
关闭8080端口
sudo iptables -I INPUT -i eth0 -p tcp --dport 8080 -j DROP
sudo iptables -I OUTPUT -o eth0 -p tcp --sport 8080 -j DROP
这一步主要是检测一下摄像头是否可用,如果没有摄像头的,可以跳过。
安装 luvcview
sudo apt-get install luvcview
启动摄像头
luvcview
拍照
raspistill -v -o test.jpg
使用默认设置录制一段 5 秒钟的视频片段(1080p30)
raspivid -t 5000 -o video.h264
OpenCV是一个基于BSD许可(开源)发行的跨平台计算机视觉和机器学习软件库,可以运行在Linux、Windows、Android和Mac OS操作系统上。 [1] 它轻量级而且高效——由一系列 C 函数和少量 C++ 类构成,同时提供了Python、Ruby、MATLAB等语言的接口,实现了图像处理和计算机视觉方面的很多通用算法。
由于在树莓派上安装opencv失败几率比较大,需要大家严格按照操作步骤,一步一步进行,避免出现差错导致安装失败。
python版本切换
树莓派中一般同时安装2.7和3.7版本的python,并且默认2.7版本的python。安装TensorFlow前建议先切换python版本
##卸载python2.7
sudo apt-get autoremove python2.7
##若出现有几个软件包无法下载的报错,输入以下命令后再次卸载python2.7,即执行上一步操作,**切记一定要在卸载一次python2.7**
sudo apt-get update --fix-missing
##链接python3.7
sudo ln -s /usr/bin/python3.7 /usr/bin/python#链接如果显示错误,再次卸载一遍python2.7即可
##链接pip3
sudo ln -s /usr/bin/pip3 /usr/bin/pip
##检验python版本,输入python,可以看到显示3.7的版本即为成功,否则继续前两步操作
存储空间的操作
使用16G及其以上的卡,最好是class10以上,然后扩大文件系统。因为,用SD卡安装完系统后一大部分空间实际是未被分配的。我是用的64g的tf卡,在京东上买的闪迪,大概50块钱左右。
使用命令
sudo raspi-config
选择Advanced Options→Expand Filesystem Ensures that all of the SD card storage is available to the OS.
随后重启树莓派,重启命令:sudo reboot
OpenCV相关库的下载
之所以把代码分行写,是因为我发现一次性运行如下全部代码,容易报错,所以,我后来就是逐行复制粘贴并运行的。一切顺利。
sudo pip3 install numpy
sudo apt-get install build-essential git cmake pkg-config
sudo apt-get install libjpeg8-dev
sudo apt-get install libtiff5-dev
sudo apt-get install libjasper-dev -y
sudo apt-get install libpng12-dev
sudo apt-get install libavcodec-dev libavformat-dev libswscale-dev libv4l-dev
sudo apt-get install libgtk2.0-dev
sudo apt-get install libatlas-base-dev gfortran
下载OpenCV包及其编译
OpenCV version of 4.4.0-dev及其缺失文件
链接:https://pan.baidu.com/s/16-9FtYL8uahXRvbN_We_kg
提取码:rwwm
里面有两个压缩包,opencv-master.zip和opencv_contrib-master.zip。另外一个Lost_files里放置的是树莓派安装OpenCV时缺失的以“i”结尾的文件。
复制文件到树莓派
在树莓派 /home/pi下新建文件夹opencv,将下载的文件复制进去。
解压文件:
cd ~/opencv
unzip opencv_contrib-master.zip
unzip opencv-master.zip
解压完毕后,可以吧压缩包删掉,以节省空间。
接下来把Lost_files中的所有文件复制到/home/pi/opencv/opencv_contrib-master/modules/xfeatures2d/src/路径下。
设置编译参数
cd ~/opencv/opencv-master
mkdir build
cd build
Cmake经过配置,可在~/opencv/opencv-master/build文件夹下生成Build files.代码如下:
cmake -D CMAKE_BUILD_TYPE=RELEASE \
-D CMAKE_INSTALL_PREFIX=/usr/local \
-D INSTALL_C_EXAMPLES=ON \
-D INSTALL_PYTHON_EXAMPLES=ON \
-D OPENCV_EXTRA_MODULES_PATH=/home/pi/opencv/opencv_contrib-master/modules \
-D BUILD_EXAMPLES=ON \
-D WITH_LIBV4L=ON \
-D PYTHON3_EXECUTABLE=/usr/bin/python3.7 \
-D PYTHON_INCLUDE_DIR=/usr/include/python3.7 \
-D PYTHON_LIBRARY=/usr/lib/arm-linux-gnueabihf/libpython3.7m.so \
-D PYTHON3_NUMPY_INCLUDE_DIRS=/usr/lib/python3/dist-packages/numpy/core/include \
..
配置成功之后,显示类似如下界面,最后一行是重点。
增加swap空间
将swap大小从100MB增加到1024MB,可以方便OpenCV使用Pi的4个核进行编译。
sudo nano /etc/dphys-swapfile
找到CONF_SWAPSIZE=100,将100改为1024。按ctrl+O后,回车保存,ctrl+x退出,最后记得改回来哦。使用如下命令重启:
sudo /etc/init.d/dphys-swapfile stop
sudo /etc/init.d/dphys-swapfile start
复制hpp文件
每次在编译过程中都会报错,找不到文件,经过排查之后,发现编译时只需要复制这5个文件到指定目录之后,编译就会通过。
在/home/pi/opencv-master/modules/xfeatures2d/test/文件夹里面
test_invariance_utils.hpp
test_detectors_regression.impl.hpp
test_detectors_invariance.impl.hpp
test_descriptors_regression.impl.hpp
test_descriptors_invariance.impl.hpp
复制到/home/pi/opencv_contrib-master/modules/xfeatures2d/test/目录下
同时,修改该目录下的test_features2d.cpp
修改test_rotation_and_scale_invariance.cpp
编译OpenCV
make -j4
如果不报错,就一直运行下去,知道100%编译成功。如果出错了,就参照如下的解决方案,处理以后,重复执行make命令。
安装OpenCV
经过几个坑之后,终于编译到100%,成功啦!此处有鲜花和掌声,耗时最长且最麻烦的一步已经趟过去了。
执行如下安装指令:
sudo make install
import numpy as np
import cv2
cap = cv2.VideoCapture(0)
cap.set(3,640) # set Width
cap.set(4,480) # set Height
while(True):
ret, frame = cap.read()
#frame = cv2.flip(frame, -1) # Flip camera vertically
gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
#cv2.imshow('frame', frame)
cv2.imshow('gray', gray)
k = cv2.waitKey(30) & 0xff
if k == 27: # press 'ESC' to quit
break
cap.release()
cv2.destroyAllWindows()
上面的代码可捕捉PiCam生成的视频流,用BGR颜色和灰色模式展示。要结束该程序,你必须在键盘上按 [ESC] 键。在按 [ESC] 键之前,先鼠标点击视频窗口。
至此,树莓派的相关环境配置已经全部完成,下一步就可以愉快地撸代码了,写得腰酸背痛的。