web-dev-qa-db-fra.com

Python OpenCV charge l'image à partir d'une chaîne d'octets

J'essaie de charger l'image à partir d'une chaîne comme PHP function imagecreatefromstring

Comment puis je faire ça?

J'ai une image de champ blob MySQL. J'utilise MySQLdb et je ne veux pas créer de fichier temporaire pour travailler avec des images dans PyOpenCV.

REMARQUE: besoin de la fonction wrapper cv (pas cv2)

30
featureoffuture

C'est ce que j'utilise normalement pour convertir les images stockées dans la base de données en images OpenCV en 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)

J'ai ajouté la conversion de numpy.ndarray à cv2.cv.iplimage, donc le script ci-dessus s'imprimera:

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

J'ai essayé d'utiliser ce code pour créer un opencv à partir d'une chaîne contenant un tampon brut (données en pixels ordinaires) et cela ne fonctionne pas dans ce cas particulier.

Voici donc comment procéder pour ce type de données:

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

(mais oui, vous devez connaître les propriétés de votre image)

si votre canal B et G est permuté, voici comment y remédier:

image = cv2.cvtColor(image, cv2.cv.CV_BGR2RGB)
6
Alexandre Mazel