The entire process can be described in following steps -
- Send image frame to EC2 instance
- Process frame
- Send it back to client
I used socket programming, Exposed a port and transferred data to it.This method is very slow, It's taking an average of 0.7 seconds to send a frame and 1.2 seconds to transfer from server to client.Below is the code snippet I used :
Client : Reads a frame, transfers to server, then , receives the processed frame back and displays it
ret,frame = cap.read()
data = pickle.dumps(frame) # Serialising data
message_size = struct.pack("L", len(data))
clientsocket.sendall(message_size + data) #Sending frame
#Receiving frame
while len(recv_data) < payload_size:
recv_data += clientsocket.recv(8192)
packed_msg_size = recv_data[:payload_size]
recv_data = recv_data[payload_size:]
msg_size = struct.unpack("L", packed_msg_size)[0]
while len(recv_data) < msg_size:
recv_data += clientsocket.recv(8192)
frame_data = recv_data[:msg_size]
new_frame = pickle.loads(frame_data)
recv_data = recv_data[msg_size:]
#Displaying received data
cv2.namedWindow("output", cv2.WINDOW_NORMAL)
cv2.imshow("output", new_frame)
Server : Receives a frame, processes it, send the processed frame back to client
while True:
while len(data) < payload_size:
data += conn.recv(4096)
packed_msg_size = data[:payload_size]
data = data[payload_size:]
msg_size = struct.unpack("L", packed_msg_size)[0]
while len(data) < msg_size:
data += conn.recv(4096)
frame_data = data[:msg_size]
data = data[msg_size:]
frame = pickle.loads(frame_data)
#Processing frame
new_frame = pickle.dumps(frame)
#Data received
message_size = struct.pack("L",len(new_frame))
#Sending data back
conn.sendall(message_size + new_frame)
This method is very slow, Need to transfer data real time.
与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…