如何从stdin而不是从文件读取图像数据?
使用c++接口,这似乎是可能的:https://stackoverflow.com/a/5458035/908515。函数imdecode
在Python中也是可用的。但是它期望numpy array
作为(第一个)参数。我不知道如何转换stdin数据。
这是我尝试过的:
import cv
import sys
import numpy
stdin = sys.stdin.read()
im = cv.imdecode(numpy.asarray(stdin), 0)
Result: TypeError: <unknown> data type = 18 is not supported
看起来python stdin缓冲区对于图像来说太小了。您可以运行带有-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
我已经尝试了上面的解决方案,但无法使其工作。用sys.stdin.buffer.read()替换sys.stdin.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()