55

我正在尝试从字符串中加载图像,例如 PHP 函数imagecreatefromstring

我怎样才能做到这一点?

我有 MySQL blob 字段图像。我正在使用MySQLdb,不想创建临时文件来处理 PyOpenCV 中的图像。

注意:需要 cv(不是 cv2)包装函数

4

3 回答 3

127

这是我通常用来将存储在数据库中的图像转换为 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.ndarrayto的转换cv2.cv.iplimage,所以上面的脚本将打印:

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

编辑: 从最新的 numpy 开始1.18.5 +np.fromstring发出警告,因此np.frombuffer应在那个地方使用。

于 2013-06-18T13:57:15.840 回答
23

我认为这个stackoverflow问题提供的这个答案是这个问题的更好答案。

引用细节(从上面链接的答案中借用@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)
于 2019-11-20T15:52:10.207 回答
9

我尝试使用此代码从包含原始缓冲区(纯像素数据)的字符串创建一个 opencv,但在这种特殊情况下它不起作用。

因此,以下是对此类数据执行此操作的方法:

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

(但是是的,您需要知道您的图像属性)

如果您的 B 和 G 通道被置换,以下是修复它的方法:

image = cv2.cvtColor(image, cv2.cv.CV_BGR2RGB)
于 2015-01-30T12:18:05.050 回答