发送图像时预期的 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]]
类型错误:使用烧瓶读取 pdf 文件时预期的 str、字节或 os.PathLike 对象,而不是 FileStorage
JSON 对象必须是 str、bytes 或 bytearray,而不是 dict
Fastparquet 在使用 dataframe.to_parquet() 时给出“TypeError:预期的 str、字节或 os.PathLike 对象,而不是 _io.BytesIO”