Как исправить «UnicodeDecodeError: кодек« utf-8 »не может декодировать байт 0x85 в позиции 884: неверный стартовый байт» в сокетах Python - PullRequest
0 голосов
/ 17 мая 2019

Я делаю клиент-серверную программу.клиент должен передать изображение с веб-камеры на сервер, сервер должен использовать библиотеку dlib для вычисления точек на лице и отправки их клиенту.

Клиент - Raspberry pi 3 (b +?), сервер настольный на Ubuntu 16.04

server.py

import socket
import dlib
import cv2
from io import BytesIO
from imutils import face_utils
import numpy as np

def calculateShape(img):
    rects = detector(img, 0)
    try:
        shape = face_utils.shape_to_np(predictor(img, rects[0]))
    except IndexError:
        print('Face not found.')
        shape = numpy.ndarray(Array([0]))
    return shape

face_cascade = cv2.CascadeClassifier('haarcascade_frontalface_default.xml')
detector = dlib.get_frontal_face_detector()
predictor = dlib.shape_predictor("shape_predictor_68_face_landmarks.dat")

sock = socket.socket()
sock.bind(('', 9091))
sock.listen(1)
conn, addr = sock.accept()

print('connected:', addr)

while True:
    try:
        f = BytesIO()
        while True:
            data = conn.recv(1024)
            if not data:
                break
            if len(data) != 0:
                f.write(data)
            else:
                print('break')
                break
        f.seek(0)
        image = np.loads(f.read().rstrip())
        f.close()
        cv2.imwrite('frame.jpg', image)
        key = cv2.waitKey(1) & 0xFF

        dataBack = calculateShape(image).dumps()
        print(str(calculateShape(image))) #conn.send(dataBack + b' ' * (2048 - len(data)))
    except KeyboardInterrupt:
        pass
    finally:
        conn.close()
        sock.close()

conn.close()

client.py

import socket
from imutils.video import VideoStream
from io import BytesIO
import numpy as np

c = 0
camera = VideoStream(src = 1).start()

sock = socket.socket()
sock.connect(('192.168.2.79', 9091))
while True:
    try:
        dataSend = BytesIO(camera.read().dumps())
        while True:
            c+=1
            print(c)
            data = dataSend.read(1024)
            if len(data) == 1024:
                sock.send(data)
            if len(data) > 0:
                sock.send(data + b' ' * (1025 - len(data)))
            if not data:
                break
    except KeyboardInterrupt:
        pass
    finally:
        sock.close()

#dataGet = np.loads(sock.recv(2048).rstrip())

sock.close()

print(data)

Я получил ошибку

Traceback (most recent call last):
  File "server.py", line 52, in <module>
    image = np.loads(f.read().rstrip())
  File "/usr/local/lib/python3.5/dist-packages/numpy/lib/npyio.py", line 44, in loads
    return pickle.loads(*args, **kwargs)
UnicodeDecodeError: 'utf-8' codec can't decode byte 0x85 in position 884: invalid start byte

Traceback (most recent call last):
  File "client.py", line 19, in <module>
    sock.send(data)
OSError: [Errno 9] Bad file descriptor

,но программа должна делать все правильно.

...