2012-11-27 55 views
21

我试图在OpenCV的相机方法中提取的图像上使用Zbar库的QR码检测方法。通常情况下,QR码检测方法可以在我的计算机上处​​理图像(jpg,png等),但我猜OpenCV的捕获帧是不同的。
有没有一种方法可以将拍摄到的帧变成PIL图像?将openCV图像转换为Python中的PIL图像(用于Zbar库)

谢谢。

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 

回答

56

使用Python CV2,你也可以这样做:

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

我想我可能找到了答案。我稍后会用结果编辑。

的OpenCV到PIL图片

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

来源:http://opencv.willowgarage.com/documentation/python/cookbook.html

+0

到目前为止,我遇到了一些麻烦,其中转换图像是不是真的我拍摄的图像。 – QuantumRich

+0

嘿,我有和你一样的问题,这个工作,但实际接受的答案没有。您应该将其标记为已接受 –

4

你想获得一个RGB图像?如果是这样的话,你需要从这个更改参数:

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

到:

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

,因为它是记录几乎无处,但Image.fromstring的“L”参数用于8位B & W图像。此外,您需要将cv.CreateImage函数的参数从1(单通道图像)更改为3(3通道= RGB)。

希望它适合你。 干杯