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

6
我该如何从标准输入中读取图像数据而不是从文件中读取呢?
使用C ++接口,似乎可以实现:https://dev59.com/6FXTa4cB1Zd3GeqP3qQk#5458035。函数imdecode在Python中也是可用的。但它期望一个numpy数组作为(第一个)参数。我不知道如何转换标准输入数据。
这是我尝试过的:
import cv
import sys
import numpy

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

结果:类型错误:不支持未知数据类型=18


一个图像如何在stdin中表示? - Igonato
@Igonato:作为JPEG数据,例如my_program < example.jpeg。实际上,我正在使用另一个程序从网络摄像头获取数据,并且我想避免创建临时文件。 - undur_gongor
2个回答

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

1
谢谢。我没有遇到标准输入缓冲问题。它可以在不使用“-u”的情况下正常工作。 - undur_gongor
1
我已经试图弄清楚这个问题很长时间了。感谢您发布这篇文章。我不知道frombuffer函数。 - Profane

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()

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接