【问题标题】:Read PNG image from stream with 4 channels从具有 4 个通道的流中读取 PNG 图像
【发布时间】:2021-10-07 08:41:08
【问题描述】:

我正在开发一个不和谐的机器人,它接受用于 OCR 目的的所有类型的图像。当用户上传具有 4 个通道的 PNG 时,它会出错。我的意思是它读取图像几乎是 100% 白色,而实际图像充满了色彩。

我尝试使用 cv2.COLOR_BGRA2BGR 进行转换,但这不起作用。但是在我的 pytest 中它确实有效。这可能是因为我在我的 pytest 中使用了 cv2.imread,这与我的实际代码有点不同。

代码(损坏)

for a in supported_attachments:
  async with aiohttp.ClientSession() as session:
    async with session.get(a) as res:
      if res.status == 200:
        buffer = io.BytesIO(await res.read())
        arr = np.asarray(bytearray(buffer.read()), dtype=np.uint8)
        img = cv2.imdecode(arr, -1)
        if len(img.shape) > 2 and img.shape[2] == 4:
          print('convert')
          img = cv2.cvtColor(img, cv2.COLOR_BGRA2BGR)
          plt.imshow(cv2.cvtColor(img, cv2.COLOR_BGR2RGB))
          plt.show() 
        images.append(img)

pytest(有效)

image = cv2.imread('../tests/images/stats/english/kills_png.png', cv2.COLOR_BGRA2BGR)

有什么建议或想法吗?

【问题讨论】:

  • 第一步,去掉幻数——cv2.imdecode(arr, -1)应该是cv2.imdecode(arr, cv2.IMREAD_UNCHANGED)。这不是更容易理解吗?现在,如果您希望 imread 以相同的方式运行,只需使用相同的标志调用它即可。
  • 好的,谢谢您的回复。

标签: python opencv discord.py opencv-python


【解决方案1】:

标志cv2.COLOR_BGRA2BGR 用于cv2.cvtColor() 而不是cv2.imread()

cv2.imread() 的所有清单常量都以 cv2.IMREADxxx 开头并定义为 here

【讨论】:

  • 嗯,但是通过在我的 pytest 中使用 image = cv2.imread('../tests/images/stats/english/kills_png.png', cv2.COLOR_BGRA2BGR) 工作得很好,没有那个标志不起作用。
  • 不只是错误,imread 也是无用的,因为它的计算结果为 1,就像第二个参数 IMREAD_COLOR 的默认值一样。
  • 感谢您的编辑,阅读链接并修复它。
猜你喜欢
  • 1970-01-01
  • 2016-08-20
  • 1970-01-01
  • 1970-01-01
  • 2016-07-26
  • 1970-01-01
  • 2020-09-18
  • 1970-01-01
  • 2020-05-16
相关资源
最近更新 更多