import numpy as np
import cv2 as cv
def read_image(content: bytes) -> np.ndarray:
"""
Image bytes to OpenCV image
:param content: Image bytes
:returns OpenCV image
:raises TypeError: If content is not bytes
:raises ValueError: If content does not represent an image
"""
if not isinstance(content, bytes):
raise TypeError(f"Expected 'content' to be bytes, received: {type(content)}")
image = cv.imdecode(np.frombuffer(content, dtype=np.uint8), cv.IMREAD_COLOR)
if image is None:
raise ValueError(f"Expected 'content' to be image bytes")
return image
5条答案
按热度按时间fhity93d1#
这是我通常使用Python将存储在数据库中的图像转换为OpenCV图像。
我添加了从
numpy.ndarray
到cv2.cv.iplimage
的转换,因此上面的脚本将打印:**编辑:**截至最新numpy
1.18.5 +
,np.fromstring
引发警告,因此应在该位置使用np.frombuffer
。lfapxunr2#
我认为this堆栈溢出问题上提供的this答案是此问题的更好答案。
报价详情(借用@lamhoangtung以上连结答案)
1cklez4t3#
我曾尝试使用这段代码从包含原始缓冲区(纯像素数据)的字符串创建opencv,但在这种特殊情况下不起作用。
下面是针对这类数据的处理方法:
(but是的,您需要知道您的图像属性)
如果您B和G通道被置换,以下是修复方法:
fae0ux8s4#
我是按照@jabaldonedo的解决方案,但它似乎有点旧,需要一些调整。
顺便说一下,我正在使用OpenCV3.4.8.29。
相同图像:正确
mzsu5hc05#
有一个问题:
如果缓冲区太短或包含无效数据,则函数返回[None]
OpenCV给人一种不同寻常的宽容感觉,下面的函数可以适应这种情况: