Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 3.x cv2.误差:(-215)尺寸.宽度>;0&&;尺寸、高度>;函数cv::imshow中的0_Python 3.x_Multithreading_Sockets_Opencv_Base64 - Fatal编程技术网

Python 3.x cv2.误差:(-215)尺寸.宽度>;0&&;尺寸、高度>;函数cv::imshow中的0

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

我尝试使用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(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()