曾看到一個影片,是利用 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讀取條碼:
• Web Camera x 1
安裝步驟很簡單, 只要一下執行以下指令兩行安裝指令即可開始使用:
其中 -o 參數是指定產生的圖檔檔名,最後一個參數就加上要轉換的文字訊息。zbarimg將圖檔轉成條碼內容,請參考下一段說明。
轉換出來的 QR Code 為:
如果感覺圖片太小,可以使用 -s 參數調整大小,預設是 3 且數字越大圖形越大:
另有一種產生 QR Code 的方法,可到 QR Code Generator 網站,產生二維條碼,然後按下 Download 就可以產生一個二維條碼的圖檔。
• /dev/video0 是指從 video0 讀取影像
• --prescale=320x240 掃描條碼時的影像大小
若在指令列亦可執行條碼掃描程式,只是沒有畫面可能會對不準條碼位置,執行指令如下:
• --nodisplay 不顯示影像畫面
如果要使用 Python透過 ZBar 讀取條碼,需先安裝 python-zbar 函式庫:
以下的 Python程式,是透過WebCam掃描條碼後辨識條碼的內容 (源自 ZBar/Python/Sample)
執行時一直出現以下錯誤:
後來才發現,我用 pi 的帳號執行 python程式,權限不夠無法開啟 WebCam,改用root執行,就可以正常掃描條碼及解出條碼內容。
如果要將掃描檔案的值傳給 python 程式,可透過 pipe 的方式傳遞參數:
• ZBar bar code reader
• sourceforge.net:ZBar bar code reader
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
作者已經移除這則留言。
回覆刪除因為這個Webcam是超廣角的,且無法調整焦距,我測試時也是很容易模糊,後來將條碼放大列印,且離稍微遠一點才能對到焦點。如果要改善的話,應該只能換Webcam。露天拍賣有賣很便宜的Webcam,可手動調整焦距從3公分~無限遠,可以試用這類的Webcam,應該可以改善這個問題。
刪除我想请问,使用opecv,zbar读取qrcoder,和单纯的使用zbar也就是你的例子,他们之间有区别么?
回覆刪除我沒使用opencv的zbar讀取, 抱歉! 無法回答您的問題. 改天我也來試試opencv的功能.
刪除張貼留言