【问题标题】:Load BytesIO image with opencv使用 opencv 加载 BytesIO 图像
【发布时间】:2026-02-08 13:50:01
【问题描述】:

我正在尝试从 io.BytesIO() 结构加载带有 OPENCV 的图像。 最初,代码使用 PIL 加载图像,如下所示:

image_stream = io.BytesIO()
image_stream.write(connection.read(image_len))
image_stream.seek(0)
image = Image.open(image_stream)
print('Image is %dx%d' % image.size)

我尝试像这样用 OPENCV 打开:

image_stream = io.BytesIO()
image_stream.write(connection.read(image_len))
image_stream.seek(0)
img = cv2.imread(image_stream,0)
cv2.imshow('image',img)

但似乎 imread 不处理 BytesIO()。我遇到了一个错误。

我正在使用 OPENCV 3.3 和 Python 2.7。请问,有人可以帮我吗?

【问题讨论】:

    标签: python opencv imread


    【解决方案1】:

    恩里克 试试这个:

    import numpy as np
    import cv2 as cv
    import io
    
    image_stream = io.BytesIO()
    image_stream.write(connection.read(image_len))
    image_stream.seek(0)
    file_bytes = np.asarray(bytearray(image_stream.read()), dtype=np.uint8)
    img = cv.imdecode(file_bytes, cv.IMREAD_COLOR)
    

    【讨论】:

    • 虽然这是“ok”代码,但我只是发布了一个answer,代码更短,不需要writeimage_lenseekbytearray
    【解决方案2】:

    arrybn 提供的答案对我有用。只需在 cv2.imshow 之后添加 cv2.waitkey(1)。代码如下:

    服务器端:

    import io
    import socket
    import struct
    import cv2
    import numpy as np
    
    server_socket = socket.socket()
    server_socket.bind(('0.0.0.0', 8000))
    server_socket.listen(0)
    
    connection = server_socket.accept()[0].makefile('rb')
    cv2.namedWindow("Image", cv2.WINDOW_NORMAL)
    try:
        while True:
            image_len = struct.unpack('<L', connection.read(struct.calcsize('<L')))[0]
            if not image_len:
                break
            image_stream = io.BytesIO()
            image_stream.write(connection.read(image_len))
            image_stream.seek(0)
            file_bytes = np.asarray(bytearray(image_stream.read()), dtype=np.uint8)
            img = cv2.imdecode(file_bytes, cv2.IMREAD_COLOR)
            cv2.imshow("Image", img)
            cv2.waitKey(1)
    finally:
        connection.close()
        server_socket.close()
    

    基于示例Capturing to a network stream

    【讨论】: