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)