Python OpenCV从字节字符串加载图像

evrscar2  于 2023-01-31  发布在  Python
关注(0)|答案(5)|浏览(161)

我正在尝试从字符串加载图像,如PHP函数imagecreatefromstring
我该怎么做呢?
我有MySQL blob字段图像。我正在使用MySQLdb,不想在PyOpenCV中创建用于处理图像的临时文件。
注意:需要cv(非cv2) Package 函数

fhity93d

fhity93d1#

这是我通常使用Python将存储在数据库中的图像转换为OpenCV图像。

import numpy as np
import cv2
from cv2 import cv

# Load image as string from file/database
fd = open('foo.jpg')
img_str = fd.read()
fd.close()

# CV2
nparr = np.fromstring(img_str, np.uint8)
img_np = cv2.imdecode(nparr, cv2.CV_LOAD_IMAGE_COLOR) # cv2.IMREAD_COLOR in OpenCV 3.1

# CV
img_ipl = cv.CreateImageHeader((img_np.shape[1], img_np.shape[0]), cv.IPL_DEPTH_8U, 3)
cv.SetData(img_ipl, img_np.tostring(), img_np.dtype.itemsize * 3 * img_np.shape[1])

# check types
print type(img_str)
print type(img_np)
print type(img_ipl)

我添加了从numpy.ndarraycv2.cv.iplimage的转换,因此上面的脚本将打印:

<type 'str'>
<type 'numpy.ndarray'>
<type 'cv2.cv.iplimage'>

**编辑:**截至最新numpy 1.18.5 +np.fromstring引发警告,因此应在该位置使用np.frombuffer

lfapxunr

lfapxunr2#

我认为this堆栈溢出问题上提供的this答案是此问题的更好答案。
报价详情(借用@lamhoangtung以上连结答案)

import base64
import json
import cv2
import numpy as np

response = json.loads(open('./0.json', 'r').read())
string = response['img']
jpg_original = base64.b64decode(string)
jpg_as_np = np.frombuffer(jpg_original, dtype=np.uint8)
img = cv2.imdecode(jpg_as_np, flags=1)
cv2.imwrite('./0.jpg', img)
1cklez4t

1cklez4t3#

我曾尝试使用这段代码从包含原始缓冲区(纯像素数据)的字符串创建opencv,但在这种特殊情况下不起作用。
下面是针对这类数据的处理方法:

image = np.fromstring(im_str, np.uint8).reshape( h, w, nb_planes )

(but是的,您需要知道您的图像属性)
如果您B和G通道被置换,以下是修复方法:

image = cv2.cvtColor(image, cv2.cv.CV_BGR2RGB)
fae0ux8s

fae0ux8s4#

我是按照@jabaldonedo的解决方案,但它似乎有点旧,需要一些调整。
顺便说一下,我正在使用OpenCV3.4.8.29。

im_path = 'path/to/foo.jpg'
with open(im_path, 'rb') as fp:
    im_b = fp.read()
image_np = np.frombuffer(im_b, np.uint8)
img_np = cv2.imdecode(image_np, cv2.IMREAD_COLOR)  

im_cv = cv2.imread(im_path)

print('Same image: {}'.format(np.all(im_cv == img_np)))

相同图像:正确

mzsu5hc0

mzsu5hc05#

有一个问题:
如果缓冲区太短或包含无效数据,则函数返回[None]
OpenCV给人一种不同寻常的宽容感觉,下面的函数可以适应这种情况:

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

相关问题