python套接字腌制numpy数据不显示

问题描述

我正在尝试通过套接字发送python-opencv帧。我正在对数据进行酸洗并进行酸洗,但是由于某种原因,它为空白或什么都没有显示。

这是我运行client.py

时的终端
new message length: b'720       '

它应该正在从服务器流式传输网络摄像头,但没有任何显示。

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

client.py

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)

server.py

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数据有关吗?我听说这可能很棘手。

解决方法

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

因此,您的程序在客户端的while True:上无限期循环。

为客户尝试以下程序。我用虚拟数据进行了测试。

client.py

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:
    msg_length=int(s.recv(HEADERSIZE))
    full_msg=b''
    while len(full_msg)<msg_length:
        full_msg+=s.recv(msg_length-len(full_msg))
    
    print(full_msg)
    
    d = pickle.loads(full_msg)
    cv2.namedWindow('Webcam',cv2.WINDOW_NORMAL)
    cv2.imshow('Webcam',full_msg)

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...