【树莓派】使用opencv获取摄像头画面并实时传输到电脑显示——python3

安装opencv的路程艰辛

令我百思不得其解的opencv安装今天终于有了进展,我意外在B站找到了教程视频里找到了办法:

树莓派安装OpenCV以及实时视频传输

在尝试之前还要卸载原来安装的opencv,以免发生错误:

sudo pip3 uninstall opencv-python

如果试了很久还不行那就果断换镜像吧,不要再浪费时间了。

感谢学长发给我的镜像:

https://zhuanlan.zhihu.com/p/73999807

以及:

https://blog.csdn.net/qq_33401838/article/details/104843132

———————————————————————————————————————

把树莓派摄像头的画面实时传输到电脑

下面是我参考B站视频整理出来的代码。

主要使用了opencv进行图像获取,把每一帧图像
和分别在树莓派上和电脑上布置好了相关的库就可以完成视频的实时传送。注意WiFi信号一定要好,否则会卡,正常视频延时在一秒钟以内。

1、在树莓派上安装必要的库:

a) 安装:opencv

sudo apt-get install -y libopencv-dev python3-opencv

b) 安装计算库:numpy

sudo pip3 install numpy

c) 安装帧传输模块:zmq

sudo pip3 install zmq

d) 安装帧的编码和解码的库:

sido pip3 install pybase64

e) 安装picamera

sudo pip3 install picamera

2、数梅派端代码

#!/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) #释放内存,准备进行下一帧的视频图像传输


3、在电脑上同样安装一遍上面的库,不过不再需要安装picamera库

4、电脑端视频接收的代码:

#!/usr/bin/env python
# -*- coding=utf-8 -*-

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) #延时等待,防止出现窗口无响应
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章