• 树莓派实时视频传输


     1 # -*- coding: utf-8 -*-
     2 # __author__ = "赵鹏"
     3 # Date: 2019/8/16
     4 
     5 import socket
     6 import threading
     7 import struct
     8 import time
     9 import cv2
    10 import numpy
    11 
    12 
    13 class Carame_Accept_Object:
    14     def __init__(self, S_addr_port=("127.0.0.1", 8880)):
    15         self.resolution = (640, 480)  # 分辨率
    16         self.img_fps = 15  # 每秒传输多少帧数
    17         self.addr_port = S_addr_port
    18         self.Set_Socket(self.addr_port)
    19 
    20     # 设置套接字
    21     def Set_Socket(self, S_addr_port):
    22         self.server = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    23         self.server.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)  # 端口可复用
    24         self.server.bind(S_addr_port)
    25         self.server.listen(5)
    26         # print("the process work in the port:%d" % S_addr_port[1])
    27 
    28 
    29 def check_option(object, client):
    30     # 按格式解码,确定帧数和分辨率
    31     info = struct.unpack('lhh', client.recv(8))
    32     if info[0] > 888:
    33         object.img_fps = int(info[0]) - 888  # 获取帧数
    34         object.resolution = list(object.resolution)
    35         # 获取分辨率
    36         object.resolution[0] = info[1]
    37         object.resolution[1] = info[2]
    38         object.resolution = tuple(object.resolution)
    39         return 1
    40     else:
    41         return 0
    42 
    43 
    44 def RT_Image(object, client, D_addr):
    45     if (check_option(object, client) == 0):
    46         return
    47     camera = cv2.VideoCapture(0)  # 从摄像头中获取视频
    48     img_param = [int(cv2.IMWRITE_JPEG_QUALITY), object.img_fps]  # 设置传送图像格式、帧数
    49     while 1:
    50         time.sleep(0.1)  # 推迟线程运行0.1s
    51         _, object.img = camera.read()  # 读取视频每一帧
    52         gray = cv2.cvtColor(object.img, cv2.COLOR_BGR2GRAY)
    53         object.img = cv2.resize(object.img, object.resolution)  # 按要求调整图像大小(resolution必须为元组)
    54         ret, img_encode = cv2.imencode('.jpg', object.img, img_param)  # 按格式生成图片
    55         img_code = numpy.array(img_encode)  # 转换成矩阵
    56         object.img_data = img_code.tostring()  # 生成相应的字符串
    57         try:
    58             # 按照相应的格式进行打包发送图片
    59             client.send(
    60                 struct.pack("lhh", len(object.img_data), object.resolution[0], object.resolution[1]) + object.img_data)
    61         except:
    62             camera.release()  # 释放资源
    63             return
    64 
    65 
    66 if __name__ == '__main__':
    67     camera = Carame_Accept_Object()
    68     while 1:
    69         client, D_addr = camera.server.accept()
    70         clientThread = threading.Thread(None, target=RT_Image, args=(camera, client, D_addr,))
    71         clientThread.start()
     1 # -*- coding: utf-8 -*-
     2 # __author__ = "赵鹏"
     3 # Date: 2019/8/16
     4 
     5 
     6 import socket
     7 import cv2
     8 import threading
     9 import struct
    10 import numpy
    11 
    12 
    13 class Camera_Connect_Object:
    14     def __init__(self, D_addr_port=["", 8880]):
    15         self.resolution = [640, 480]
    16         self.addr_port = D_addr_port
    17         self.src = 888 + 15  # 双方确定传输帧数,(888)为校验值
    18         self.interval = 0  # 图片播放时间间隔
    19         self.img_fps = 100  # 每秒传输多少帧数
    20 
    21     def Set_socket(self):
    22         self.client = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    23         self.client.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
    24 
    25     def Socket_Connect(self):
    26         self.Set_socket()
    27         self.client.connect(self.addr_port)
    28         print("IP is %s:%d" % (self.addr_port[0], self.addr_port[1]))
    29 
    30     def RT_Image(self):
    31         # 按照格式打包发送帧数和分辨率
    32         self.name = self.addr_port[0] + " Camera"
    33         self.client.send(struct.pack("lhh", self.src, self.resolution[0], self.resolution[1]))
    34         while (1):
    35             info = struct.unpack("lhh", self.client.recv(8))
    36             buf_size = info[0]  # 获取读的图片总长度
    37             if buf_size:
    38                 try:
    39                     self.buf = b""  # 代表bytes类型
    40                     temp_buf = self.buf
    41                     while (buf_size):  # 读取每一张图片的长度
    42                         temp_buf = self.client.recv(buf_size)
    43                         buf_size -= len(temp_buf)
    44                         self.buf += temp_buf  # 获取图片
    45                         data = numpy.fromstring(self.buf, dtype='uint8')  # 按uint8转换为图像矩阵
    46                         self.image = cv2.imdecode(data, 1)  # 图像解码
    47                         gray = cv2.cvtColor(self.image, cv2.COLOR_BGR2GRAY)
    48                         cv2.imshow(self.name, self.image)  # 展示图片
    49                 except:
    50                     pass;
    51                 finally:
    52                     if (cv2.waitKey(10) == 27):  # 每10ms刷新一次图片,按‘ESC’(27)退出
    53                         self.client.close()
    54                         cv2.destroyAllWindows()
    55                         break
    56 
    57     def Get_Data(self, interval):
    58         showThread = threading.Thread(target=self.RT_Image)
    59         showThread.start()
    60 
    61 
    62 if __name__ == '__main__':
    63     camera = Camera_Connect_Object()
    64     camera.addr_port[0] = input("Please input IP:")
    65     camera.addr_port = tuple(camera.addr_port)
    66     camera.Socket_Connect()
    67     camera.Get_Data(camera.interval)
  • 相关阅读:
    Asp.net文章内容分页
    JQuery文字不间断滚动
    .Net Core利用反射动态加载DLL类库的方法(解决类库不包含Nuget依赖包的问题)
    【Bug】远程登录导致WPF应用程序中的UserControl控件Loaded事件重复触发
    【原创】WPF TreeView带连接线样式的优化(WinFrom风格)
    DataGrid 字体垂直居中
    Elasticsearch.Net
    利用数学归纳法指导编写递归程序
    多种图像格式相互转换工具的开发(附源代码)
    油气大数据分析 第一章 软计算基础(第四、五、六节)
  • 原文地址:https://www.cnblogs.com/zhao-peng-/p/11364201.html
Copyright © 2020-2023  润新知