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

举报
不脱发的程序猿 发表于 2021/01/01 00:20:04 2021/01/01
【摘要】 上次实验使用Python—OpenCV实现,发现传输效果并不是很理想,接下来使用Python和picamera实现树莓派/PC实时摄像头数据共享,主要也可分为服务器和客户端两部分。 服务器(PC/树莓派)Demo如下: import numpy as npimport cv2import socketclass VideoStreamingTest(object): de...

上次实验使用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

文章来源: handsome-man.blog.csdn.net,作者:不脱发的程序猿,版权归原作者所有,如需转载,请联系作者。

原文链接:handsome-man.blog.csdn.net/article/details/82628061

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。