树莓派/PC实现实时摄像头数据共享(Python—picamera)
上次实验使用Python—OpenCV实现,发现传输效果并不是很理想,接下来使用Python和picamera实现树莓派/PC实时摄像头数据共享,主要也可分为服务器和客户端两部分。
服务器(PC/树莓派)Demo如下:
- import numpy as np
- import cv2
- import socket
- class VideoStreamingTest(object):
- def __init__(self, host, port):
-
- self.server_socket = socket.socket()
- self.server_socket.bind((host, port))
- self.server_socket.listen(0)
- self.connection, self.client_address = self.server_socket.accept()
- self.connection = self.connection.makefile('rb')
- self.host_name = socket.gethostname()
- self.host_ip = socket.gethostbyname(self.host_name)
- self.streaming()
-
- def streaming(self):
-
- try:
- print("Host: ", self.host_name + ' ' + self.host_ip)
- print("Connection from: ", self.client_address)
- print("Streaming...")
- print("Press 'q' to exit")
-
- # need bytes here
- stream_bytes = b' '
- while True:
- stream_bytes += self.connection.read(1024)
- first = stream_bytes.find(b'\xff\xd8')
- last = stream_bytes.find(b'\xff\xd9')
- if first != -1 and last != -1:
- jpg = stream_bytes[first:last + 2]
- stream_bytes = stream_bytes[last + 2:]
- image = cv2.imdecode(np.frombuffer(jpg, dtype=np.uint8),
- cv2.IMREAD_COLOR)
- cv2.imshow('image', image)
- if cv2.waitKey(1) & 0xFF == ord('q'):
- break
- finally:
- self.connection.close()
- self.server_socket.close()
-
-
- if __name__ == '__main__':
- # host, port
- h, p = "192.168.0.4", 8000
- VideoStreamingTest(h, p)
客户端(树莓派)Demo如下:
- import io
- import socket
- import struct
- import time
- import picamera
- # create socket and bind host
- client_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
- client_socket.connect(('192.168.2.104', 8000))
- connection = client_socket.makefile('wb')
-
- try:
- with picamera.PiCamera() as camera:
- camera.resolution = (320, 240) # pi camera resolution
- camera.framerate = 15 # 15 frames/sec
- time.sleep(2) # give 2 secs for camera to initilize
- start = time.time()
- stream = io.BytesIO()
-
- # send jpeg format video stream
- for foo in camera.capture_continuous(stream, 'jpeg', use_video_port = True):
- connection.write(struct.pack('<L', stream.tell()))
- connection.flush()
- stream.seek(0)
- connection.write(stream.read())
- if time.time() - start > 600:
- break
- stream.seek(0)
- stream.truncate()
- connection.write(struct.pack('<L', 0))
- finally:
- connection.close()
- client_socket.close()
无论是运行速度还是画质都是比较理想的。
树莓派与PC视频数据传输 最优方法:https://blog.csdn.net/m0_38106923/article/details/86562451
关注公众号,发送关键字:Java车牌识别,获取项目源码。