Python 3.x cv2.误差:(-215)尺寸.宽度>;0&&;尺寸、高度>;函数cv::imshow中的0
我尝试使用python 3中的套接字进行视频流。我使用imutils.video.FileVideoStream连续读取帧,并使用base64编码通过服务器将图像从客户端发送到另一个客户端。下面是我的Send()函数:- 发送Python 3.x cv2.误差:(-215)尺寸.宽度>;0&&;尺寸、高度>;函数cv::imshow中的0,python-3.x,multithreading,sockets,opencv,base64,Python 3.x,Multithreading,Sockets,Opencv,Base64,我尝试使用python 3中的套接字进行视频流。我使用imutils.video.FileVideoStream连续读取帧,并使用base64编码通过服务器将图像从客户端发送到另一个客户端。下面是我的Send()函数:- 发送 def Send(): fvs = FileVideoStream(0).start() time.sleep(1.0) while True: frame = fvs.read() # cvImage = cv2.cvtColor(np.array(f
def Send():
fvs = FileVideoStream(0).start()
time.sleep(1.0)
while True:
frame = fvs.read()
# cvImage = cv2.cvtColor(np.array(frame), cv2.COLOR_BGR2RGB)
# pil = Image.fromarray(cvImage)
# b = io.BytesIO()
# pil.save(b, 'jpeg')
# imgBytes = b.getvalue()
encoded, buffer = cv2.imencode('.jpg', frame)
jpg_as_text = base64.b64encode(buffer)
length = str(len(jpg_as_text))
# print("client is sending...")
client.sendall(length.encode(encoding='utf_8'))
client.sendall(jpg_as_text)
接收
def Recieve():
print("Client is recieving...")
while True:
length = int(client.recv(2 * BufferSize).decode("utf-8"))
print("length:- {}".format(length))
data = b''
while True:
if len(data) < length:
to_read = length - len(data)
data += client.recv(BufferSize if to_read > BufferSize else to_read)
else:
break
# pilBytes = io.BytesIO(data)
# pilBytes.seek(0)
# pilImage = Image.open(pilBytes)
# cvImage = cv2.cvtColor(np.array(pilImage), cv2.COLOR_RGB2BGR)
# cv2.imshow("Video", np.array(pilImage))
print("data length:- {}".format(len(data)))
img = base64.b64decode(data)
npimg = np.fromstring(img, dtype=np.uint8)
source = cv2.imdecode(npimg, 1)
cv2.imshow("Stream", source)
cv2.waitKey(1)
客户端
import cv2
from socket import socket, AF_INET, SOCK_STREAM
from threading import Thread
import base64
import numpy as np
import time
def Recieve():
print("Client is recieving...")
while True:
length = int(client.recv(2 * BufferSize).decode("utf-8"))
print("length:- {}".format(length))
data = b''
while True:
if len(data) < length:
to_read = length - len(data)
data += client.recv(BufferSize if to_read > BufferSize else to_read)
else:
break
print("data length:- {}".format(len(data)))
img = base64.b64decode(data)
npimg = np.fromstring(img, dtype=np.uint8)
source = cv2.imdecode(npimg, 1)
cv2.imshow("Stream", source)
cv2.waitKey(1)
def Send():
cap = cv2.VideoCapture(0)
time.sleep(1.0)
while True:
ret, frame = cap.read()
jpg_as_text = base64.b64encode(frame)
length = str(len(jpg_as_text))
client.sendall(length.encode(encoding='utf_8'))
client.sendall(jpg_as_text)
似乎
imdecode
失败了,我想您在过程中的某个地方破坏了数据。使用一些小的合成图像进行尝试,并验证您输入的imdecode
与imencode
完全相同。我在本地主机上尝试从字节对图像数据进行编码和解码,结果一切顺利,但当我在客户机上打印“source”变量时,结果是没有。我不知道我的数据在哪里损坏了。好的,你能把代码转换成一个-,也就是说,我们可以复制/粘贴到一个文件中(本例中是两个文件)并运行(不需要任何修改,例如添加缺少的导入等)以重现问题吗?我尝试只粘贴代码的相关部分,希望有帮助……对不起,请注意我是怎么说的,甚至给出了一个解释——你发布的内容仍然没有达到目标。“最小”是指重现问题所需的最少代码量,包括没有无用的注释(我至少计算16条)。它还意味着依赖性最小——现在您需要FileVideoStream
,您能用合成图像再现错误吗,例如16x16,每个像素的灰度不同?您需要发送多张图像,还是第一张图像会中断?|“完整”的意思是“没有遗漏的导入”(我粗略地看了一下至少有4个)。
from socket import socket, AF_INET, SOCK_STREAM
from threading import Thread
HOST = "192.168.43.215"
PORT = 4000
BufferSize = 4096
addresses = {}
def Connections():
while True:
client, addr = server.accept()
print("{} is connected!!".format(addr))
addresses[client] = addr
Thread(target=ClientConnection, args=(client, )).start()
def ClientConnection(client):
length = int(client.recv(BufferSize).decode("utf-8"))
SendLength(client, str(length))
data = b''
while length > BufferSize:
length -= BufferSize
data += client.recv(BufferSize)
data += client.recv(length)
broadcast (client,data)
print (length)
print("Frame sent ")
def SendLength(clientSocket, length):
for client in addresses:
if client != clientSocket:
print("sending length:- {}".format(length))
client.send(length.encode("utf-8"))
def broadcast(clientSocket, data_to_be_sent):
for client in addresses:
if client != clientSocket:
print("Broadcasting...")
client.sendall(data_to_be_sent)
server = socket(family=AF_INET, type=SOCK_STREAM)
try:
server.bind((HOST, PORT))
except OSError:
print("Server Busy")
server.listen(2)
print("Waiting for connection..")
AcceptThread = Thread(target=Connections)
AcceptThread.start()
AcceptThread.join()
import cv2
from socket import socket, AF_INET, SOCK_STREAM
from threading import Thread
import base64
import numpy as np
import time
def Recieve():
print("Client is recieving...")
while True:
length = int(client.recv(2 * BufferSize).decode("utf-8"))
print("length:- {}".format(length))
data = b''
while True:
if len(data) < length:
to_read = length - len(data)
data += client.recv(BufferSize if to_read > BufferSize else to_read)
else:
break
print("data length:- {}".format(len(data)))
img = base64.b64decode(data)
npimg = np.fromstring(img, dtype=np.uint8)
source = cv2.imdecode(npimg, 1)
cv2.imshow("Stream", source)
cv2.waitKey(1)
def Send():
cap = cv2.VideoCapture(0)
time.sleep(1.0)
while True:
ret, frame = cap.read()
jpg_as_text = base64.b64encode(frame)
length = str(len(jpg_as_text))
client.sendall(length.encode(encoding='utf_8'))
client.sendall(jpg_as_text)
RecieveThread = Thread(target=Recieve).start()
SendThread = Thread(target=Send).start()
print("Waiting for connection..")
AcceptThread = Thread(target=Connections)
AcceptThread.start()
AcceptThread.join()