局域網下實現高清低延時圖傳(一)

乘着空閒時間想做一個基於樹莓派的監控,所以第一步就需要實現樹莓派的攝像功能。
我這裏用到的是樹莓派盜版的攝像頭(CSI接口攝像頭),在淘寶上購買的價格也就在30RMB左右,很便宜。
個人博客:https://www.xiaokai1999.cn/

一、樹莓派的攝像頭操作

1.查看是否加載到了對應的video device設備:
ls /dev/


可以看到在裏面沒有看到vedio device,如果有的話會有vedioX(X={0,1,2,3…})

2.使能樹莓派攝像頭
sudo raspi-config

選擇Interfacing Option,選中Select然後Enter進入;

接下來機會問你是否同意使能Pi camera,選擇是然後會讓你重啓,選擇 “是”

3、重啓完之後,看看/dev下面是否存在攝像頭設備:
ls -al /dev/ | grep video

如果有vedio device 就可以確定沒有問題了。

4.拍攝照片
raspistill -o new.jpg
5.查看照片
xdg-open new.jpg

二、遠程流視頻傳輸1(python實現)

主機.py

import cv2
import socket
import numpy as np
cap = cv2.VideoCapture(0)

s = socket.socket()
img_param = [int(cv2.IMWRITE_JPEG_QUALITY), 95]#opencv 圖像清晰度,幀數
port = 12345

s.bind(("192.168.229.129",port)) #綁定ip地址和端口
s.listen(5)						#等待客戶機連接
c,addr = s.accept()				#接受客戶機連接
while True:
    ret,frame = cap.read()
    frame = cv2.resize(frame, (320,230))
    print("連接地址:"+addr[0])
    _, img_encode = cv2.imencode('.jpg', frame, img_param)#opencv圖像編碼
    img_code = np.array(img_encode)
    img_data = img_code.tostring()#將數組格式轉爲字符串格式
    print(img_data)
    c.send(bytes(str(len(img_data)).ljust(16),encoding="utf8"))# 先發送數據的長度
    c.send(img_data)#再發送數據內容
    cv2.imshow("主機",frame)
    if cv2.waitKey(1)==27:
        c.close()
        break

客戶機.py

import socket
import cv2
import numpy as np
import gzip

def recv_all(s,count):
    buf=bytes()
    while count:
        newbuf = s.recv(count)
        if not newbuf:return None
        buf+=newbuf
        count-=len(newbuf)
    return buf

s = socket.socket()
host = socket.gethostname()
port = 12345

while True:
    try:
        s.connect(("192.168.229.129",port))
    except:
        print("有錯誤")
    else:
        break
while True:
    data_len = recv_all(s,16)
    if len(data_len) == 16:
        stringData = recv_all(s, int(data_len))
        
        data = np.fromstring(stringData, dtype='uint8')
        
        tmp = cv2.imdecode(data, 1)  # 解碼處理,返回mat圖片
        
        img = cv2.resize(tmp, (320, 230))
        print(img)
        cv2.imshow('客戶機', img)
    if cv2.waitKey(1) == 27:
        break
s.close()

效果

缺點

我程序不夠完善,只實現了一發一接,能實現一發多接就完美了。但是這種方法會比較麻煩。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章