发送图像时预期的 str、bytes 或 os.PathLike 对象,而不是 numpy.ndarray

Posted

技术标签:

【中文标题】发送图像时预期的 str、bytes 或 os.PathLike 对象,而不是 numpy.ndarray【英文标题】:Expected str, bytes or os.PathLike object, not numpy.ndarray when sending image 【发布时间】:2022-01-03 11:03:18 【问题描述】:

我正在尝试通过套接字将单个帧从我的客户端发送到服务器。当图像的路径明确时,我的代码有效。但是,我将图像作为字符串接收并对其进行解码。我想将图像作为文件发送到我的服务器。

这是客户端代码:

import numpy as np
import cv2
from PIL import Image
import base64
import socket
import pickle
import struct
import io

def main(data):
    client = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    client.connect(('192.168.0.14', 9999))
    BUFFER_SIZE = 4096*4

    decoded_data = base64.b64decode(data)
    np_data = np.fromstring(decoded_data, np.uint8)
    img = cv2.imdecode(np_data, cv2.IMREAD_UNCHANGED)

    with open(img, 'rb') as file:
        file_data = file.read(BUFFER_SIZE)

    while file_data:
        client.send(file_data)
        file_data = file.read(BUFFER_SIZE)

我正在尝试将图像作为参数传递以打开,但是图像没有被返回。我在 java 上运行 chaquopy 脚本,给出的错误是:

TypeError: expected str, bytes or os.PathLike object, not numpy.ndarray
        at <python>.script.main

以及接收图像的服务器:

import socket
import time


date_string = time.strftime("%Y-%m-%d-%H:%M")



server = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
server.bind(('192.168.0.14', 9999))

server.listen()

BUFFER_SIZE = 4096*4

while True:
    client_socket, _ = server.accept()
    
    
    with open('frames_saved/'+date_string+'.jpeg', 'wb') as file:
        recv_data = client_socket.recv(BUFFER_SIZE)
        while recv_data:
            file.write(recv_data)
            recv_data = client_socket.recv(BUFFER_SIZE)

【问题讨论】:

如果你的内存中已经有了图片,为什么还要调用open()img 肯定不是文件名。 我不知道如何读取正在发送的图像,只要图像块正在发送,使用其他方法。基本上,我一直在寻找通过将图像转换为文件来发送图像的最简单方法,所以我不必担心它。如何将图像作为图像发送到服务器,或将其作为文件读取?我不确定在这里做什么。 【参考方案1】:

如果decoded_data已经是一个完整的图像文件,那么我不明白你为什么需要使用NumPy或OpenCV。直接发送到socket即可:

decoded_data = base64.b64decode(data)
client.send(decoded_data)

【讨论】:

以上是关于发送图像时预期的 str、bytes 或 os.PathLike 对象,而不是 numpy.ndarray的主要内容,如果未能解决你的问题,请参考以下文章

预期类型 Union[str, bytes, int] 但得到 Sequence[Union[int, float, str]]

Python 编码,str,bytes

类型错误:使用烧瓶读取 pdf 文件时预期的 str、字节或 os.PathLike 对象,而不是 FileStorage

JSON 对象必须是 str、bytes 或 bytearray,而不是 dict

python3 str或bytes转换函数

Fastparquet 在使用 dataframe.to_parquet() 时给出“TypeError:预期的 str、字节或 os.PathLike 对象,而不是 _io.BytesIO”