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)