Я использую этот код для отправки картинок с клиента на сервер, это не проблема.
server.py
import socket
import cv2
import pickle
import struct
HOST='127.0.0.1'
PORT=8485
s=socket.socket(socket.AF_INET,socket.SOCK_STREAM)
print('Socket created')
s.bind((HOST,PORT))
print('Socket bind complete')
s.listen(10)
print('Socket now listening')
conn,addr=s.accept()
data = b""
payload_size = struct.calcsize(">L")
print("payload_size: {}".format(payload_size))
while True:
while len(data) < payload_size:
print("Recv: {}".format(len(data)))
data += conn.recv(4096)
print("Done Recv: {}".format(len(data)))
packed_msg_size = data[:payload_size]
data = data[payload_size:]
msg_size = struct.unpack(">L", packed_msg_size)[0]
print("msg_size: {}".format(msg_size))
while len(data) < msg_size:
data += conn.recv(4096)
frame_data = data[:msg_size]
data = data[msg_size:]
frame=pickle.loads(frame_data, fix_imports=True, encoding="bytes")
frame = cv2.imdecode(frame, cv2.IMREAD_COLOR)
cv2.imshow('ImageWindow',frame)
cv2.waitKey(1)
client.py
import cv2
import socket
import struct
import pickle
client_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
client_socket.connect(('127.0.0.1', 8485))
connection = client_socket.makefile('wb')
cam = cv2.VideoCapture(0)
img_counter = 0
encode_param = [int(cv2.IMWRITE_JPEG_QUALITY), 90]
while True:
ret, frame = cam.read()
result, frame = cv2.imencode('.jpg', frame, encode_param)
data = pickle.dumps(frame, 0)
size = len(data)
print("{}: {}".format(img_counter, size))
client_socket.sendall(struct.pack(">L", size) + data)
img_counter += 1
cam.release()
Отображение изображений с клиента на сервер. Вышеприведенный код работает без проблем.
Но теперь я хочу отправить изображения с клиента на сервер, сервер получает изображения клиента, затем обрабатывает изображения клиента, а затем отправляет обработанные изображения и серийный номер картинки для клиента, затем отображает картинки и серийный номер, возвращенные сервером на клиенте.
Итак, я написал следующий код, но теперь этот код не работает, где не так?
server_1.py
import socket
import cv2
import pickle
import struct
HOST='127.0.0.1'
PORT=8485
socketserver=socket.socket(socket.AF_INET,socket.SOCK_STREAM)
print('Socket created')
socketserver.bind((HOST,PORT))
print('Socket bind complete')
socketserver.listen(10)
print('Socket now listening')
clientsocket,addr=socketserver.accept()
data = b""
payload_size = struct.calcsize(">L")
print("payload_size: {}".format(payload_size))
img_counter = 1
while True:
while len(data) < payload_size:
print("Recv: {}".format(len(data)))
data += clientsocket.recv(4096)
print("Done Recv: {}".format(len(data)))
packed_msg_size = data[:payload_size]
data = data[payload_size:]
msg_size = struct.unpack(">L", packed_msg_size)[0]
print("msg_size: {}".format(msg_size))
while len(data) < msg_size:
data += clientsocket.recv(4096)
frame_data = data[:msg_size]
frame=pickle.loads(frame_data, fix_imports=True, encoding="bytes")
frame = cv2.imdecode(frame, cv2.IMREAD_COLOR)
cv2.imshow('ImageWindow',frame)
image_to_client=frame.copy()
cv2.putText(image_to_client, str(img_counter), (30, 100), cv2.FONT_HERSHEY_SIMPLEX, 4.0, 255, 5)
to_client_data = pickle.dumps(image_to_client, 0)
size = len(to_client_data)
clientsocket.sendall(struct.pack(">L", size) + to_client_data)
img_counter += 1
cv2.waitKey(1)
msg = str(img_counter)
clientsocket.send(msg.encode("utf-8"))
client_1.py
import cv2
import socket
import struct
import pickle
client_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
client_socket.connect(('127.0.0.1', 8485))
connection = client_socket.makefile('wb')
cam = cv2.VideoCapture(0)
img_counter = 1
encode_param = [int(cv2.IMWRITE_JPEG_QUALITY), 90]
rec_data = b""
payload_size = struct.calcsize(">L")
while True:
ret, frame = cam.read()
result, frame = cv2.imencode('.jpg', frame, encode_param)
data = pickle.dumps(frame, 0)
size = len(data)
print("{}: {}".format(img_counter, size))
client_socket.sendall(struct.pack(">L", size) + data)
img_counter += 1
while len(rec_data) < payload_size:
print("Recv: {}".format(len(rec_data)))
rec_data += client_socket.recv(4096)
print("Done Recv: {}".format(len(rec_data)))
packed_msg_size = rec_data[:payload_size]
rec_data = rec_data[payload_size:]
msg_size = struct.unpack(">L", packed_msg_size)[0]
print("msg_size: {}".format(msg_size))
while len(rec_data) < msg_size:
rec_data += client_socket.recv(4096)
frame_data = rec_data[:msg_size]
rec_frame = pickle.loads(frame_data, fix_imports=True, encoding="bytes")
rec_frame = cv2.imdecode(rec_frame, cv2.IMREAD_COLOR)
cv2.imshow('ClientReceiveImg', rec_frame)
cv2.waitKey(1)
msg = client_socket.recv(1024)
print(msg.decode("utf-8"))
cam.release()
Сообщение об ошибке:
Ошибка OpenCV: Ошибка подтверждения (size.width> 0 && size.height> 0) в файле cv :: imshow, файл D: \ Build \ OpenCV \ opencv-3.3.1 \ modules \ highgui \ src \ window. cpp, строка 339
client_1.py 35 cv2.imshow ('ClientReceiveImg', rec_frame)
cv2.error: D: \ Build \ OpenCV \ ope ncv-3.3.1 \ modules \ highgui \ src \ window. cpp: 339: ошибка: (-215) size.width> 0 && size.height> 0 в функции cv :: imshow