Raspberry Pi 筆記(34):ZBar 讀取二維條碼

曾看到一個影片,是利用 Web Cam 來讀取條碼,想說利用 Raspberry 安裝程式,透過 Web Cam 讀取條碼,判讀條碼內容,在網路搜尋一下有兩套程式可以使用:一是ZBar,另一套是ZXing,本文將整理 ZBar 的一些指令與用法,如需瞭解 ZXing 的用法,可參考 Github zxing

ZBar 是 Linux 環境的一套開放軟體,可用來掃描條碼,讀取條碼或QR Code的內容,將其轉換成文字。他可以支援多種條碼格式,包括:EAN-13、UPC-A、UPC-E、EAN-8、Code 128、Code 39、Interleaved 2 of 5 及 QR code等[維基百科]。以下就來看看如何從Web Cam讀取條碼:


[材料]

• Raspberry Pi 2 Model B x 1
• Web Camera  x 1

[安裝程序]

要安裝 zbar,記得先更新系統:
$ sudo apt-get update

安裝步驟很簡單, 只要一下執行以下指令兩行安裝指令即可開始使用:
$ sudo apt-get install zbar-tools
$ sudo apt-get install qrencode

[產生條碼]

裝好之後,就可以使用了,qrencode 這個程式的作用就是把一串文字 (通常是網址) 轉換成二維條碼,例如我的部落格網址:

$ qrencode -o atceiling.png 'http://atceiling.blogspot.tw/'

其中 -o 參數是指定產生的圖檔檔名,最後一個參數就加上要轉換的文字訊息。zbarimg將圖檔轉成條碼內容,請參考下一段說明。

轉換出來的 QR Code 為:
如果感覺圖片太小,可以使用 -s 參數調整大小,預設是 3 且數字越大圖形越大:

$ qrencode -o atceiling.png -s 5 'http://atceiling.blogspot.tw/'

另有一種產生 QR Code 的方法,可到 QR Code Generator 網站,產生二維條碼,然後按下 Download 就可以產生一個二維條碼的圖檔。


[掃描條碼]

進入 x-windows 介面後,執行以下指令讀取條碼:
$ sudo zbarcam /dev/video0 --prescale=320x240

• /dev/video0 是指從 video0 讀取影像
• --prescale=320x240 掃描條碼時的影像大小


若在指令列亦可執行條碼掃描程式,只是沒有畫面可能會對不準條碼位置,執行指令如下:
$ sudo zbarcam /dev/video0 --nodisplay

•  --nodisplay 不顯示影像畫面

如果要使用 Python透過 ZBar 讀取條碼,需先安裝 python-zbar 函式庫:
$ sudo apt-get install python-zbar

以下的 Python程式,是透過WebCam掃描條碼後辨識條碼的內容 (源自 ZBar/Python/Sample)

#!/usr/bin/python
from sys import argv
import zbar

# create a Processor
proc = zbar.Processor()

# configure the Processor
proc.parse_config('enable')

# initialize the Processor
device = '/dev/video0'
if len(argv) > 1:
    device = argv[1]
proc.init(device)

# enable the preview window
proc.visible = True

# read at least one barcode (or until window closed)
proc.process_one()

# hide the preview window
proc.visible = False

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

執行時一直出現以下錯誤:
   File "read.py", line 15, in <module>
    proc.init(device)
zbar.SystemError: ERROR: zbar processor in zbar_processor_init():
    system error: spawning input thread: Invalid argument (22)

後來才發現,我用 pi 的帳號執行 python程式,權限不夠無法開啟 WebCam,改用root執行,就可以正常掃描條碼及解出條碼內容。

[透過條碼圖檔辨識條碼]

如果將條碼存成一個檔案,可使用 zbarimg讀取影像的條碼值,指令如下:
$ zbarimg atceiling.png

如果要將掃描檔案的值傳給 python 程式,可透過 pipe 的方式傳遞參數:
$ zbarimg atceiling.png | upcrpc.py

[參考資料]

• ZBar bar code reader
• sourceforge.net:ZBar bar code reader

4 留言

  1. 作者已經移除這則留言。

    回覆刪除
    回覆
    1. 因為這個Webcam是超廣角的,且無法調整焦距,我測試時也是很容易模糊,後來將條碼放大列印,且離稍微遠一點才能對到焦點。如果要改善的話,應該只能換Webcam。露天拍賣有賣很便宜的Webcam,可手動調整焦距從3公分~無限遠,可以試用這類的Webcam,應該可以改善這個問題。

      刪除
  2. 我想请问,使用opecv,zbar读取qrcoder,和单纯的使用zbar也就是你的例子,他们之间有区别么?

    回覆刪除
    回覆
    1. 我沒使用opencv的zbar讀取, 抱歉! 無法回答您的問題. 改天我也來試試opencv的功能.

      刪除

張貼留言

較新的 較舊