2012-11-27 5 views
21

Ich versuche, die QR-Code-Erkennung Methoden der Zbar-Bibliothek auf Bildern mit OpenCV Kamera Methoden extrahieren. Normalerweise arbeiten die QR-Code-Erkennungsmethoden mit Bildern (jpg, png usw.) auf meinem Computer, aber ich denke, die erfassten Bilder von OpenCV sind unterschiedlich.
Gibt es eine Möglichkeit, den aufgenommenen Rahmen in ein PIL-Bild zu verwandeln?konvertieren openCV Bild in PIL Bild in Python (für die Verwendung mit Zbar-Bibliothek)

Vielen Dank.

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 

Antwort

56

Mit dem Python CV2, können Sie auch dies tun:

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() 
7

Ich denke, dass ich die Antwort gefunden haben kann. Ich werde später mit Ergebnissen bearbeiten.

OpenCV zu PIL Bild

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()) 

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

+0

Bisher habe ich einige Probleme habe, in dem das umgewandelte Bild nicht wirklich das Bild, das ich gefangen. – QuantumRich

+0

Hey, ich hatte das gleiche Problem wie du und das hat funktioniert, aber die tatsächlich akzeptierte Antwort nicht. Sie sollten dies als akzeptiert markieren –

4

Versuchen Sie, ein RGB-Bild zu erhalten? Wenn das der Fall ist, müssen Sie Ihre Parameter aus, dies ändern:

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

zu, dass:

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

da es fast nirgends dokumentiert ist, aber die ‚L‘ Parameter von Image.fromstring sind für 8-Bit B & W Bilder. Außerdem müssen Sie das Argument Ihrer cv.CreateImage-Funktion von 1 (Einkanalbild) auf 3 (3 Kanäle = RGB) ändern.

Ich hoffe, es funktioniert für Sie. Prost