1

我一直在使用 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()
4

2 回答 2

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
于 2013-01-14T23:26:25.807 回答
1

如果你在 python 中工作,我建议你看看SimpleCV。您可以使用我们的条形码读取实现,也可以自己使用该库。这是使用 zbar 提取条形码的来源。

于 2012-11-27T14:51:01.027 回答