树莓派入坑总结与小案例实时视频监控

硬件:树莓派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虚拟桌面或者直接接键盘鼠标到树莓派

  

    

原文地址:https://www.cnblogs.com/wulianwangaxing/p/14768692.html