zoukankan      html  css  js  c++  java
  • 树莓派入坑总结与小案例实时视频监控

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

      

        

  • 相关阅读:
    QT多个UI文件加入一个项目
    【Go语言】学习资料
    MVC如何在Pipeline中接管请求的?
    ASP.NET MVC路由(5)
    C# dll 事件执行 js 回调函数
    初识Identity
    SpringMVC拦截器
    UrlRouting的理解
    ASP.NET MVC路由
    ASP.NET MVC Module
  • 原文地址:https://www.cnblogs.com/wulianwangaxing/p/14768692.html
Copyright © 2011-2022 走看看