硬件:树莓派3B,摄像头500W像素,4.5寸触摸屏。(屏幕驱动以及摄像头驱动商家提供)
入坑树莓派挺久了,一直没有记录一些问题,今天有时间把问题总结记录一下。
一.树莓派更换源
由于树莓派官方源在国外太卡太慢,所以我们把源更换为阿里源或者清华或者中科大的。
步骤1.确保树莓派网络连接上wifi或者宽带
2.在命令行窗口内输入 sudo vim /etc/apt/sources.list
并回车,进入编辑器。(如果没有安装vim建议用 sudo apt-get vim安装)
3.接着编辑这个文件,如下图所示,把原来的内容注释掉(最前面加 # 号),在文件最顶部添加下面的内容:
deb http://mirrors.tuna.tsinghua.edu.cn/raspbian/raspbian/ buster main non-free contrib
deb-src http://mirrors.tuna.tsinghua.edu.cn/raspbian/raspbian/ buster main non-free contrib
4.vim命令模式按wq退出并保存
5.同样的方法,把 /etc/apt/sources.list.d/raspi.list
文件也替换成下面的内容:
deb http://mirrors.tuna.tsinghua.edu.cn/raspberrypi/ buster main ui
5.然后树莓派更新源下载源都改好了,后面下载安装就会更快。
二.树莓派安装opencv和python以及一些必要的库
a) 安装:opencv
sudo apt-get install -y libopencv-dev python3-opencv
b) 安装计算库:numpy
sudo pip3 install numpy
c) 安装帧传输模块:zmq
sudo pip3 install zmq
d) 安装帧的编码和解码的库:
sudo pip3 install pybase64
e) 安装picamera sudo pip3 install picamera
三.测试opencv库以及python
# -*- coding: utf-8 -*-
__author__ = "kyoRan"
import cv2
cap = cv2.VideoCapture(0) # 打开摄像头
print("VideoCapture is opened?", cap.isOpened())
while(True):
ret, frame = cap.read() # 读取摄像头图像
center = (frame.shape[1]//2, frame.shape[0]//2) # 图像中心点位置
# gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY) # 转灰度
cv2.circle(frame, center=center, radius=100, color=(0,0,255)) # 画圆
cv2.imshow("frame", frame) # 显示图片
if cv2.waitKey(1) & 0xFF == ord('q'):
break
cap.release() # 释放摄像头
cv2.destroyAllWindows() # 关闭所有窗口
四.实时监控代码
树莓派客户端
#!/usr/bin/env python
# -*- coding=utf-8 -*-
import cv2
import zmq
import base64
import picamera
from picamera.array import PiRGBArray
IP = '192.168.31.84' #视频接受端的IP地址
"""初始化摄像头部分"""
camera = picamera.PiCamera()
camera.resolution = (640,480)
camera.framerate = 20
rawCapture = PiRGBArray(camera, size = (640,480))
"""实例化用来发送帧的zmq对象"""
contest = zmq.Context()
"""zmq对象使用TCP通讯协议"""
footage_socket = contest.socket(zmq.PAIR)
"""zmq对象和视频接收端建立TCP通讯协议"""
footage_socket.connect('tcp://%s:5555'%IP)
print(IP)
"""循环从摄像头采集图像
由于使用的是树莓派摄像头,因此需要把use_video_port设置为True
frame为采集到的图像"""
for frame in camera.capture_continuous(rawCapture, format='bgr', use_video_port=True):
frame_image = frame.array #把采集到的图像进行转换为numpy array
encoded, buffer = cv2.imencode('.jpg', frame_image) #把转换后的图像数据再次转换成流数据,
# 并且把流数据储存到内吨buffer中
jpg_as_test = base64.b64encode(buffer) #把内存中的图像流数据进行base64编码
footage_socket.send(jpg_as_test) #把编码后的流数据发送给视频的接收端
rawCapture.truncate(0) #释放内存,准备进行下一帧的视频图像传输
电脑端代码
import cv2
import zmq
import base64
import numpy as np
"""实例化用来接收帧的zmq对象"""
context = zmq.Context()
"""zmq对象建立TCP链接"""
footage_socket = context.socket(zmq.PAIR)
footage_socket.bind('tcp://*:5555')
while True:
print("listion")
frame = footage_socket.recv_string() #接收TCP传输过来的一帧视频图像数据
img = base64.b64decode(frame) #把数据进行base64解码后储存到内存img变量中
npimg = np.frombuffer(img, dtype=np.uint8) #把这段缓存解码成一维数组
source = cv2.imdecode(npimg, 1) #将一维数组解码为图像source
cv2.imshow("Stream", source) #把图像显示在窗口中
cv2.waitKey(1) #延时等待,防止出现窗口无响应
问题
a.ssh总是断连或者连接不上
1.长时间连接如果电脑网络切换,比如说原来我电脑开的热点,后面我手机开的热点或者后面用了宽带,都有可能改变树莓派或者主机的IP地址,需要改一下在连接
2.树莓派的ssh服务没有开启,在树莓派上启用 SSH. SSH 在树莓派上是默认关闭的,因此在你安装好全新的 Raspbian 后打开树莓派时,你需要启用它。. 首先通过菜单进入树莓派的配置界面。. 现在进入接口interfaces标签,启动 SSH 并重启你的树莓派。. 你也可以通过终端直接启动 SSH。. 仅需输入命令 sudo raspi-config 然后进入高级设置以启用 SSH。.
3.防火墙打开了,最好关闭掉。
树莓派安装防火墙 sudo apt-get install ufw
防火墙状态查看 sudo ufw status active是开启 inactive是未开启
防火墙开启 sudo ufw enable
防火墙关闭 sudo ufw disable
开放端口号8090 sudo ufw allow 8090
b.树莓派安装包依赖问题的解决
当在树莓派安装软件时,时常遇到因安装包依赖问题导致无法成功安装的问题,此时可以使用aptitude (Debian系统的包管理工具)。
与 apt-get 不同的是,aptitude 在处理依赖问题上更佳一些。举例来说,aptitude 在删除一个包时,会同时删除本身所依赖的包。这样,系统中不会残留无用的包,整个系统更为干净。
安装指令:sudo apt-get install aptitude
语法:aptitude(选项)(参数)
注意,安装了aptitude后,apt-get无法使用,有些安装包的情况下aptitude安装不了,这时候就很麻烦需要把aptitude卸载再找回apt-get,所以一般情况下还是用apt-get
c.在xshell中无法连接 Gtk-WARNING **: 15:12:08.891: cannot open display: localhost:10.0
,如下图
解决办法,使用VNC虚拟桌面或者直接接键盘鼠标到树莓派