Opencv 获取错误-';PngImageFile';对象没有属性';形状';使用Socketio将视频帧从客户端传输到flask服务器

Opencv 获取错误-';PngImageFile';对象没有属性';形状';使用Socketio将视频帧从客户端传输到flask服务器,opencv,python-imaging-library,flask-socketio,Opencv,Python Imaging Library,Flask Socketio,我的应用程序是在客户端打开cam,获取框架,在后端对其执行ML过程,并将其返回到客户端 这部分代码(粗体)抛出错误-PngImageFile'对象没有属性'shape' 此代码行有问题-frame=imutils.resize(pimg,width=700) 我猜某些处理的格式不正确。请引导 @socketio.on('image') def image(data_image): sbuf = io.StringIO() sbuf.write(data_image) #

我的应用程序是在客户端打开cam,获取框架,在后端对其执行ML过程,并将其返回到客户端

这部分代码(粗体)抛出错误-PngImageFile'对象没有属性'shape'

此代码行有问题-frame=imutils.resize(pimg,width=700)

我猜某些处理的格式不正确。请引导

@socketio.on('image')
def image(data_image):
    sbuf = io.StringIO()
    sbuf.write(data_image)

    # decode and convert into image
    b = io.BytesIO(base64.b64decode(data_image))
    pimg = Image.open(b)

    # Process the image frame
    frame = imutils.resize(**pimg,** width=700)
    frame = cv2.flip(frame, 1)
    imgencode = cv2.imencode('.jpg', frame)[1]

    # base64 encode
    stringData = base64.b64encode(imgencode).decode('utf-8')
    b64_src = 'data:image/jpg;base64,'
    stringData = b64_src + stringData

    # emit the frame back
    emit('response_back', stringData)

问题在于
pimg
PIL
图像格式。而
imutils.resize
函数要求图像采用Numpy数组格式。因此,在
pimg=Image.open(b)
行之后,您需要将
PIL
图像转换为Numpy数组,如下所示:

pimg = np.array(pimg)
import numpy as np
为此,必须导入numpy库,如下所示:

pimg = np.array(pimg)
import numpy as np

试试这个。对于我来说,这有助于解决类似的问题

img_arr = np.array(img.convert("RGB"))
问题在于图像的模式。我必须把它从“P”转换成“RGB”

print(img)
>> <PIL.PngImagePlugin.PngImageFile image mode=P size=500x281 at 0x7FE836909C10>
打印(img)
>> 

嘿,酷,这部分已经解决了。不过还有一个问题,在前端,我只收到黑框。很高兴知道它解决了您的这个特殊问题。就具体问题而言,你可以考虑接受这个答案。对于另一个问题,您可以提出另一个更详细的问题,以便解决。