Python-opencv:从标准输入读取图像数据
我该如何从标准输入(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