我正在尝试从字符串加载图像,如PHP函数imagecreatefromstring
我该怎么做?
我有MySQL blob字段图像。我正在使用 MySQLdb ,并且不希望创建临时文件来处理PyOpenCV中的图像。
注意:需要cv(不是cv2)包装函数
答案 0 :(得分:72)
这是我通常用于将存储在数据库中的图像转换为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.ndarray
到cv2.cv.iplimage
的转化,因此上面的脚本会打印出来:
<type 'str'>
<type 'numpy.ndarray'>
<type 'cv2.cv.iplimage'>
答案 1 :(得分:4)
我尝试使用此代码从包含原始缓冲区(普通像素数据)的字符串创建opencv,并且它不适用于那种特殊情况。
所以这里是如何为这种数据做到这一点:
image = np.fromstring(im_str, np.uint8).reshape( h, w, nb_planes )
(但是你需要知道你的图像属性)
如果你的B和G频道被置换,以下是如何修复它:
image = cv2.cvtColor(image, cv2.cv.CV_BGR2RGB)
答案 2 :(得分:1)
我认为this stackoverflow问题上提供的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)