Lire une base de 64 image encodée à partir de la mémoire à l'aide d'OpenCv bibliothèque python
Je suis en train de travailler sur une application pour faire certains de reconnaissance faciale à partir d'une webcam stream. Je reçois des données encodées en base64 uri de la toile et souhaitez l'utiliser pour faire quelque chose comme ceci:
cv2.imshow('image',img)
Les données URI ressemble à quelque chose comme ceci:
data:image/gif;base64,R0lGODlhEAAQAMQAAORHHOVSKudfOulrSOp3WOyDZu6QdvCchPGolfO0o/XBs/fNwfjZ0frl3/zy7////wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACH5BAkAABAALAAAAAAQABAAAAVVICSOZGlCQAosJ6mu7fiyZeKqNKToQGDsM8hBADgUXoGAiqhSvp5QAnQKGIgUhwFUYLCVDFCrKUE1lBavAViFIDlTImbKC5Gm2hB0SlBCBMQiB0UjIQA7
Donc, pour plus de clarté, j'ai montré ce que l'image ressemble à la chaîne base64 n'est pas cassé.
HTML:
<img src="data:image/gif;base64,R0lGODlhEAAQAMQAAORHHOVSKudfOulrSOp3WOyDZu6QdvCchPGolfO0o/XBs/fNwfjZ0frl3/zy7////wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACH5BAkAABAALAAAAAAQABAAAAVVICSOZGlCQAosJ6mu7fiyZeKqNKToQGDsM8hBADgUXoGAiqhSvp5QAnQKGIgUhwFUYLCVDFCrKUE1lBavAViFIDlTImbKC5Gm2hB0SlBCBMQiB0UjIQA7">
La officiel doc dit, que imread
accepte un chemin de fichier comme argument. De cette DONC réponse, si je fais quelque chose comme:
import base64
imgdata = base64.b64decode(imgstring) #I use imgdata as this variable itself in references below
filename = 'some_image.jpg'
with open(filename, 'wb') as f:
f.write(imgdata)
L'extrait de code ci-dessus fonctionne et que le fichier image est généré correctement. Cependant, je ne pense pas beaucoup de Fichier IO opérations sont réalisables, étant donné que je serais de le faire pour chaque image du flux. Je veux être en mesure de lire l'image dans la mémoire directement de la création de la img
objet.
J'ai essayé les deux solutions qui semblent être de travailler pour certaines personnes.
-
À l'aide de PIL référence:
pilImage = Image.open(StringIO(imgdata)) npImage = np.array(pilImage) matImage = cv.fromarray(npImage)
- Je obtenir
cv
pas définies comme je l'ai openCV3 installé qui est disponible pour moi commecv2
module. J'ai essayéimg = cv2.imdecode(npImage,0)
, ce ne retourne rien. -
Obtenir les octets d'décodé de la chaîne et de la convertir en un tableau numpy de toutes sortes
file_bytes = numpy.asarray(bytearray(imgdata), dtype=numpy.uint8) img = cv2.imdecode(file_bytes, 0) #Here as well I get returned nothing
La documentation n'est pas vraiment mention de ce que les imdecode
fonction renvoie. Cependant, les erreurs que j'ai rencontré, je suppose qu'il s'attend à une numpy array
ou un scalar
comme premier argument. Comment puis-je obtenir une poignée sur l'image dans la mémoire afin que je puisse faire cv2.imshow('image',img)
et toutes sortes de trucs cool par la suite.
J'espère que j'ai été capable de me faire comprendre.
- Vérifier ceci
- Merci pour votre réponse rapide @Miki, mais
np.fromstring
ne fonctionne pas ainsi. - Et
imgstring
serait URL de l'image, à droite? - c'est le base64 chaîne de caractères représentant l'image
Vous devez vous connecter pour publier un commentaire.
Vous pouvez simplement utiliser les deux cv2 et oreiller comme ceci:
Cela a fonctionné pour moi, et ne nécessite pas de PIL/oreiller ou toutes autres dépendances (à l'exception de cv2):
C'est ma solution pour python 3.7 et sans l'aide de PIL
j'espère que cette solutions fonctionne pour tous les