【樹莓派】使用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) #延時等待,防止出現窗口無響應
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章