python套接字pickled numpy数据未显示

python套接字pickled numpy数据未显示,python,sockets,opencv,python-sockets,Python,Sockets,Opencv,Python Sockets,我正在尝试通过套接字发送python opencv帧。我正在清除数据并取消勾选,但由于某种原因,它是空白的或没有显示任何内容 这是我运行client.py时的终端 new message length: b'720 ' import socket import numpy as np import cv2 import pickle HEADERSIZE = 10 s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) s.c

我正在尝试通过套接字发送python opencv帧。我正在清除数据并取消勾选,但由于某种原因,它是空白的或没有显示任何内容

这是我运行
client.py时的终端

new message length: b'720       '
import socket
import numpy as np
import cv2
import pickle

HEADERSIZE = 10

s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect((socket.gethostname(), 1232))

while True:
    full_msg = b''
    new_msg = True

    while True:
        msg = s.recv(16)
        if new_msg:
            print(f'new message length: {msg[:HEADERSIZE]}')
            msglen = int(msg[:HEADERSIZE])
            new_msg = False
                                                  
        full_msg += msg

        if len(full_msg)-HEADERSIZE == msglen:
            print('full msg recvd')
            print(full_msg[HEADERSIZE:])

            d = pickle.loads(full_msg[HEADERSIZE:])
            print(d)

            cv2.namedWindow('Webcam', cv2.WINDOW_NORMAL)
            cv2.imshow('Webcam', full_msg[HEADERSIZE:])

            new_msg = True
            full_msg = b''

    print(full_msg)
import socket
import numpy as np
import cv2
import time
import pickle
from signal import signal, SIGPIPE, SIG_DFL
signal(SIGPIPE, SIG_DFL)

HEADERSIZE = 10

s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.bind((socket.gethostname(), 1232))
s.listen(5)

cap = cv2.VideoCapture(0)

while True:
    clientsocket, address = s.accept()
    print(f"Connection from {address} has been established!")

    while True:                                                                   
        ret, frame = cap.read()                                       

        msg = pickle.dumps(frame)
        print(frame)
        msg = bytes(f'{len(frame):<{HEADERSIZE}}', "utf-8") + msg

        clientsocket.send(msg)
它应该从服务器流式传输网络摄像头,但没有显示任何内容

以下是我的客户端和服务器代码:

client.py

new message length: b'720       '
import socket
import numpy as np
import cv2
import pickle

HEADERSIZE = 10

s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect((socket.gethostname(), 1232))

while True:
    full_msg = b''
    new_msg = True

    while True:
        msg = s.recv(16)
        if new_msg:
            print(f'new message length: {msg[:HEADERSIZE]}')
            msglen = int(msg[:HEADERSIZE])
            new_msg = False
                                                  
        full_msg += msg

        if len(full_msg)-HEADERSIZE == msglen:
            print('full msg recvd')
            print(full_msg[HEADERSIZE:])

            d = pickle.loads(full_msg[HEADERSIZE:])
            print(d)

            cv2.namedWindow('Webcam', cv2.WINDOW_NORMAL)
            cv2.imshow('Webcam', full_msg[HEADERSIZE:])

            new_msg = True
            full_msg = b''

    print(full_msg)
import socket
import numpy as np
import cv2
import time
import pickle
from signal import signal, SIGPIPE, SIG_DFL
signal(SIGPIPE, SIG_DFL)

HEADERSIZE = 10

s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.bind((socket.gethostname(), 1232))
s.listen(5)

cap = cv2.VideoCapture(0)

while True:
    clientsocket, address = s.accept()
    print(f"Connection from {address} has been established!")

    while True:                                                                   
        ret, frame = cap.read()                                       

        msg = pickle.dumps(frame)
        print(frame)
        msg = bytes(f'{len(frame):<{HEADERSIZE}}', "utf-8") + msg

        clientsocket.send(msg)
server.py

new message length: b'720       '
import socket
import numpy as np
import cv2
import pickle

HEADERSIZE = 10

s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect((socket.gethostname(), 1232))

while True:
    full_msg = b''
    new_msg = True

    while True:
        msg = s.recv(16)
        if new_msg:
            print(f'new message length: {msg[:HEADERSIZE]}')
            msglen = int(msg[:HEADERSIZE])
            new_msg = False
                                                  
        full_msg += msg

        if len(full_msg)-HEADERSIZE == msglen:
            print('full msg recvd')
            print(full_msg[HEADERSIZE:])

            d = pickle.loads(full_msg[HEADERSIZE:])
            print(d)

            cv2.namedWindow('Webcam', cv2.WINDOW_NORMAL)
            cv2.imshow('Webcam', full_msg[HEADERSIZE:])

            new_msg = True
            full_msg = b''

    print(full_msg)
import socket
import numpy as np
import cv2
import time
import pickle
from signal import signal, SIGPIPE, SIG_DFL
signal(SIGPIPE, SIG_DFL)

HEADERSIZE = 10

s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.bind((socket.gethostname(), 1232))
s.listen(5)

cap = cv2.VideoCapture(0)

while True:
    clientsocket, address = s.accept()
    print(f"Connection from {address} has been established!")

    while True:                                                                   
        ret, frame = cap.read()                                       

        msg = pickle.dumps(frame)
        print(frame)
        msg = bytes(f'{len(frame):<{HEADERSIZE}}', "utf-8") + msg

        clientsocket.send(msg)
导入套接字
将numpy作为np导入
进口cv2
导入时间
进口泡菜
来自信号输入信号、信号管道、信号单元DFL
信号(信号管、信号灯)
HEADERSIZE=10
s=socket.socket(socket.AF_INET,socket.SOCK_STREAM)
s、 绑定((socket.gethostname(),1232))
s、 听(5)
cap=cv2.视频捕获(0)
尽管如此:
clientsocket,地址=s.accept()
打印(f“已建立来自{address}的连接!”)
尽管如此:
ret,frame=cap.read()
msg=pickle.dumps(帧)
打印(帧)

msg=bytes(f'{len(frame):当您从服务器流式传输720字节的帧时,实际上是一帧接一帧地连续发送每帧730字节(长度10字节+数据720字节)。
在客户端中,每个
recv()
读取16个字节。因此,如果len(full_msg)-HEADERSIZE==msglen:
的标题大小为10,则您的条件
将永远不会为真,因为730不能被16整除

因此,您的程序在
上无限循环,而在客户机中为True:

请尝试下面的客户端程序。我使用虚拟数据进行了测试

client.py

导入套接字
将numpy作为np导入
进口cv2
进口泡菜
HEADERSIZE=10
s=socket.socket(socket.AF_INET,socket.SOCK_STREAM)
s、 连接((socket.gethostname(),1232))
尽管如此:
msg_length=int(s.recv(HEADERSIZE))
完整消息=b''

当从服务器传输720字节的帧时,len(full_msg)实际上是一帧接一帧地连续发送每帧730字节(长度10字节+数据720字节)。
在客户端中,每个
recv()
读取16个字节。因此,如果len(full_msg)-HEADERSIZE==msglen:
的标题大小为10,则您的条件
将永远不会为真,因为730不能被16整除

因此,您的程序在
上无限循环,而在客户机中为True:

请尝试下面的客户端程序。我使用虚拟数据进行了测试

client.py

导入套接字
将numpy作为np导入
进口cv2
进口泡菜
HEADERSIZE=10
s=socket.socket(socket.AF_INET,socket.SOCK_STREAM)
s、 连接((socket.gethostname(),1232))
尽管如此:
msg_length=int(s.recv(HEADERSIZE))
完整消息=b''

虽然len(full_msg)解决了我最初提出的问题,但现在我遇到了一个新问题。实际上,在您回复解决方案时,我重新编写了我的程序,但我没有使用pickle,而是自己进行字节转换。我到达了与您的解决方案相同的位置:
回溯(最近一次调用):文件“client.py”,第21行,cv2.imshow(“网络摄像头”,完整信息)TypeError:参数“mat”应为Ptr
这解决了我最初提出的问题,但现在我有了一个新问题。实际上,在您回答您的解决方案时,我重新编写了我的程序,但我没有使用pickle,而是自己进行字节转换。我到达了与您的解决方案相同的位置:
回溯(最后一次调用):cv2.imshow('Webcam',full_msg)TypeError中第21行的文件“client.py”:参数“mat”应为Ptr