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

zbar で使用するために OpenCV イメージを PIL イメージに変換する必要はありません。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

これを機能させるには、基本的に次のことを行う必要があるようです。

  • LoadImage の代わりに LoadImageM を使用する
  • 画像がグレースケールであることを確認してください cv.CV_LOAD_IMAGE_GRAYSCALE を使用してください
于 2013-01-14T23:26:25.807 に答える
1

Python で作業している場合は、SimpleCVをご覧になることをお勧めします。バーコード読み取りの実装をコピーするか、ライブラリを自分で使用することができます。zbar でバーコードを引き出すソースはこちら。

于 2012-11-27T14:51:01.027 に答える