web-dev-qa-db-fra.com

convertir une image openCV en image PIL en Python (à utiliser avec la bibliothèque Zbar)

J'essaie d'utiliser les méthodes de détection de code QR de la bibliothèque Zbar sur des images extraites avec les méthodes de caméra OpenCV. Normalement, les méthodes de détection de code QR fonctionnent avec des images (jpg, png, etc.) sur mon ordinateur, mais je suppose que les images capturées d'OpenCV sont différentes.
Est-il possible de transformer le cadre capturé en une image PIL?

Je vous remercie.

from PIL import Image
import zbar
import cv2.cv as cv

capture = cv.CaptureFromCAM(1)
imgSize = cv.GetSize(cv.QueryFrame(capture))
img = cv.QueryFrame(capture)

#SOMETHING GOES HERE TO TURN FRAME INTO IMAGE
img = img.convert('L')
width, height = img.size

scanner = zbar.ImageScanner()
scanner.parse_config('enable')
zbar_img = zbar.Image(width, height, 'Y800', img.tostring())

# scan the image for barcodes
scanner.scan(zbar_img)

for symbol in zbar_img:
    print symbol.data
28
QuantumRich

Avec le python CV2, vous pouvez également le faire:

import Image, cv2

cap = cv2.VideoCapture(0) # says we capture an image from a webcam
_,cv2_im = cap.read()
cv2_im = cv2.cvtColor(cv2_im,cv2.COLOR_BGR2RGB)
pil_im = Image.fromarray(cv2_im)
pil_im.show()
72
s_kanawat

Je pense avoir trouvé la réponse. Je vais éditer plus tard avec les résultats.

OpenCV to PIL Image

import Image, cv
cv_im = cv.CreateImage((320,200), cv.IPL_DEPTH_8U, 1)
pi = Image.fromstring("L", cv.GetSize(cv_im), cv_im.tostring())

Source: http://opencv.willowgarage.com/documentation/python/cookbook.html

8
QuantumRich

Voulez-vous obtenir une image RVB? Si tel est le cas, vous devez modifier vos paramètres à partir de ceci:

cv_im = cv.CreateImage((320,200), cv.IPL_DEPTH_8U, 1)
pi = Image.fromstring("L", cv.GetSize(cv_im), cv_im.tostring())

pour que:

cv_im = cv.CreateImage((320,200), cv.IPL_DEPTH_8U, 3)
pi = Image.fromstring("RGB", cv.GetSize(cv_im), cv_im.tostring())

puisqu'il n'est documenté presque nulle part, mais le paramètre 'L' de Image.fromstring concerne les images N & B 8 bits. En outre, vous devez modifier l’argument de votre fonction cv.CreateImage de 1 (image monocanal) à 3 (3 canaux = RGB).

J'espère que cela fonctionne pour vous .

4
Raoul

Un moyen simple consiste à échanger directement les canaux. Supposons que vous tentiez de convertir un fichier image à 3 canaux entre le format OpenCV et le format PIL. Vous pouvez simplement utiliser:

img[...,[0,2]]=img[...,[2,0]]

De cette façon, vous ne serez pas dérangé par cv2.cvtColor car cette fonction ne fonctionne que sur les images ayant une certaine profondeur.

0
Qin Heyang