写点什么

树莓派 /PC 实现实时摄像头数据共享(Python—picamera)

发布于: 2021 年 07 月 07 日
树莓派/PC实现实时摄像头数据共享(Python—picamera)

上次实验使用 Python—OpenCV 实现,发现传输效果并不是很理想,接下来使用 Python 和 picamera 实现树莓派/PC 实时摄像头数据共享,主要也可分为服务器和客户端两部分。

服务器(PC/树莓派)Demo 如下:

import numpy as npimport cv2import socketclass 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 ioimport socketimport structimport timeimport picamera# create socket and bind hostclient_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

发布于: 2021 年 07 月 07 日阅读数: 5
用户头像

【研究方向】物联网、嵌入式、AI、Python 2018.02.09 加入

【公众号】美男子玩编程

评论

发布
暂无评论
树莓派/PC实现实时摄像头数据共享(Python—picamera)