转换为PIL后,无法解码OpenCV图像中的QR码

时间:2012-11-27 04:14:39

标签: python opencv python-imaging-library zbar

我一直在使用OpenCV方法从相机中获取图像。我想使用zbar库从那些图像中解码QR码,但是在我将图像转换为PIL以便由zbar处理之后,看起来似乎解码不起作用。

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


cv.NamedWindow("camera", 1)

capture = cv.CaptureFromCAM(0)

while True:
    img = cv.QueryFrame(capture)
    cv.ShowImage("camera", img)
    if cv.WaitKey(10) == 27:
        break

    # create a reader
    scanner = zbar.ImageScanner()

    # configure the reader
    scanner.parse_config('enable')

    # obtain image data
    pil = Image.fromstring("L", cv.GetSize(img), img.tostring())
    width, height = pil.size
    raw = pil.tostring()

    # wrap image data
    image = zbar.Image(width, height, 'Y800', raw)

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

    # extract results
    for symbol in image:
        # do something useful with results
        print 'decoded', symbol.type, 'symbol', '"%s"' % symbol.data


cv.DestroyAllWindows()

2 个答案:

答案 0 :(得分:3)

您不需要将OpenCV图像转换为PIL图像以便与zbar一起使用...您可以直接从OpenCV图像转到zbar并避免完全使用PIL。

现在我不知道你是怎么做的,当图像源来自相机,但如果你从磁盘加载图像,你所要做的就是:

cv_img = cv.LoadImageM(image, cv.CV_LOAD_IMAGE_GRAYSCALE)
width = cv_img.width
height = cv_img.height
raw = cv_img.tostring()

# wrap image data
image = zbar.Image(width, height, 'Y800', raw)

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

# extract results
for symbol in image:
    # do something useful with results
    print 'decoded', symbol.type, 'symbol', '"%s"' % symbol.data

看来你基本上必须做以下工作才能发挥作用:

  • 使用LoadImageM而不是LoadImage
  • 确保图像为灰度,因此请使用cv.CV_LOAD_IMAGE_GRAYSCALE

答案 1 :(得分:1)

如果您在python中工作,我建议您查看SimpleCV。您可以选择条形码读取或自己使用库。 Here is the source用zbar拉出条形码。