乘着空閒時間想做一個基於樹莓派的監控,所以第一步就需要實現樹莓派的攝像功能。
我這裏用到的是樹莓派盜版的攝像頭(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()
效果
缺點
我程序不夠完善,只實現了一發一接,能實現一發多接就完美了。但是這種方法會比較麻煩。