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

fea*_*ure 34 python byte opencv image

我正在尝试从像PHP函数的字符串加载图像 imagecreatefromstring

我怎样才能做到这一点?

我有MySQL blob字段图像.我正在使用MySQLdb,并且不希望创建临时文件来处理PyOpenCV中的图像.

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

jab*_*edo 86

这是我通常用于将存储在数据库中的图像转换为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)
Run Code Online (Sandbox Code Playgroud)

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

<type 'str'>
<type 'numpy.ndarray'>
<type 'cv2.cv.iplimage'>
Run Code Online (Sandbox Code Playgroud)

  • 使用OpenCV 3+使用`cv2.IMREAD_COLOR`而不是`cv2.CV_LOAD_IMAGE_COLOR` (10认同)
  • np.fromstring 现在已弃用,我们应该使用 np.frombuffer。其次,如果我们在 np.frombuffer 中使用原始字符串,它不会提供适当的 numpy 数组。因此,最好使用base64库来更好地读取链接“base64.b64decode(string)”的字符串。最后,我认为这里的答案(/sf/answers/4088435571/)更适合这个问题。 (4认同)

Anu*_*nha 16

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

引用细节(从上面链接的答案中借用@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)
Run Code Online (Sandbox Code Playgroud)

  • 为了使其更详细: img = cv2.imdecode(jpg_as_np, cv2.IMREAD_COLOR) (4认同)

Eyp*_*ros 8

我正在遵循 @jabaldonedo 的解决方案,但它似乎有点旧,需要一些调整。

顺便说一句,我正在使用 OpenCV 3.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)))
Run Code Online (Sandbox Code Playgroud)

同一图像:真实


小智 6

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

因此,这是处理此类数据的方法:

image = np.fromstring(im_str, np.uint8).reshape( h, w, nb_planes )
Run Code Online (Sandbox Code Playgroud)

(但是的,您需要了解您的图像属性)

如果您的B和G频道已排列,请按以下步骤解决:

image = cv2.cvtColor(image, cv2.cv.CV_BGR2RGB)
Run Code Online (Sandbox Code Playgroud)