Загрузка изображения Python OpenCV из строки байтов

Я пытаюсь загрузить изображение из строки, например, как функция PHP imagecreatefromstring

Как я могу это сделать?

У меня есть изображение поля blob в MySQL. Я использую MySQLdb и не хочу создавать временный файл для работы с изображениями в PyOpenCV.

ПРИМЕЧАНИЕ: нужна функция обертки cv (не cv2)

Ответы

Ответ 1

Это то, что я обычно использую для преобразования изображений, хранящихся в базе данных, в образы OpenCV в Python.

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, поэтому надпись script будет напечатана:

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

Ответ 2

Я пытаюсь использовать этот код для создания opencv из строки, содержащей необработанный буфер (простые пиксельные данные), и это не работает в этом странном случае.

Итак, как это сделать для такого рода данных:

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

(но да, вам нужно знать ваши свойства изображения)

если ваш канал B и G перестановлен, здесь, как его исправить:

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