Python-opencv:从标准输入读取图像数据

6 投票
2 回答
6654 浏览
提问于 2025-04-17 19:06

我该如何从标准输入(stdin)读取图像数据,而不是从文件中读取呢?

在C++的接口中,这似乎是可行的:https://stackoverflow.com/a/5458035/908515。在Python中也有一个叫imdecode的函数。不过,它需要一个numpy array作为第一个参数。我不知道怎么把标准输入的数据转换成这个格式。

这是我尝试过的:

import cv
import sys
import numpy

stdin = sys.stdin.read()
im = cv.imdecode(numpy.asarray(stdin), 0)

结果是:TypeError: <unknown> data type = 18 is not supported

2 个回答

2

我试过上面的解决办法,但没能成功。把 sys.stdin.read() 换成 sys.stdin.buffer.read() 就解决了问题:

import numpy as np
import sys
import cv2

data = sys.stdin.buffer.read()
image = np.frombuffer(data, dtype="uint8")
image = cv2.imdecode(image, cv2.IMREAD_COLOR)
cv2.imshow('stdin Image',image)
cv2.waitKey()
12

看起来Python的标准输入缓冲区对于图片来说太小了。你可以用 -u 这个选项来运行你的程序,这样就可以去掉缓冲。更多细节可以查看 这个回答。

第二点是,使用 numpy.asarray 可能不是从数据中获取numpy数组的正确方法, numpy.frombuffer 对我来说效果很好。

下面是可以正常工作的代码(我用的是 cv2 而不是 cv,希望这没什么大问题):

import sys
import cv2
import numpy

stdin = sys.stdin.read()
array = numpy.frombuffer(stdin, dtype='uint8')
img = cv2.imdecode(array, 1)
cv2.imshow("window", img)
cv2.waitKey()

可以这样执行:

python -u test.py < cat.jpeg

撰写回答