问题描述
我正在尝试通过套接字发送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)