树莓派python识别二维码_Zbar树莓派二维码(QR)识别(基于图片)
注意:如果二維碼太小的話,zbar是很難識別的,這也是我在公司解決的問題(不然隨便調用下zbar就解決問題了,圖像算法工程師就沒有存在的必要了,下文雖然是一個通用的解決方案,但對一般識別應用場景來說是足夠了。)
要使用的工具
python Image 圖像包
zbar條碼及二維碼識別庫
opencv 庫
識別效果
在樹莓派終端鍵入的命令以及得到的識別結果:
可以看到識別結果被紅色矩形框標記,QR碼的內容為YGSOFT001
接下來詳細的描述整個工作過程。
python Image圖像包的安裝
sudo apt-get install python-imaging
zbar 安裝
# "Install Zbar dev"
sudo apt-get -y install libzbar-dev
# "Get Zbar library"
wget https://pypi.python.org/packages/source/z/zbar/zbar-0.10.tar.gz
tar xzf zbar-0.10.tar.gz
# "patch Zbar"
cd zbar-0.10
wget https://github.com/npinchot/zbar/commit/d3c1611ad2411fbdc3e79eb96ca704a63d30ae69.patch
git apply d3c1611ad2411fbdc3e79eb96ca704a63d30ae69.patch
# "begin install Zbar"
sudo python setup.py install
如果安裝出現問題,請嘗試 sudo apt-get update 以及 sudo apt-get upgrade,然后再重試上面的安裝步驟。
編寫python程序
首先是導入相應的包
import zbar
import Image
import cv2
import cv
import numpy as np
import datetime
import argparse
用參數解析器,解析用戶輸入的命令
例如我們輸入python zbar_example -i xxx.png 來啟動程序,-i 后面的參數就是我們要是不的圖像xxx.png
ap = argparse.ArgumentParser()
ap.add_argument("-i", "--image", required = True, help = "Path to the image")
args = vars(ap.parse_args())
接下來我們創建和啟動zbar的掃描實例
# create a reader
scanner = zbar.ImageScanner()
# configure the reader
scanner.parse_config('enable')
接下來我們用一個循環來不停地對圖像進行QR碼識別,直到用戶在opencv窗口中鍵入”q”后,我們的程序才退出。
key = ord("0") #該變量在后面控制循環用
# 當用戶輸入'q'時,循環退出
while (key != ord("q")):
# 計算載入圖片所需的時間
d1 = datetime.datetime.now()
cv2_im = cv2.imread(args["image"])
d2 = datetime.datetime.now()
d = d2-d1
print "load image spend : %dms"%(d.microseconds/1000)
# 將圖像由BGR轉換到灰度圖
gray = cv2.cvtColor(cv2_im,cv2.COLOR_BGR2GRAY)
# 再次開始計時,以便后面計算識別二維碼的耗時
d1 = datetime.datetime.now()
# 將opencv的圖像轉換到python的PIL圖像
pil_im = Image.fromarray(gray)
# 輸出圖像的尺寸信息
width, height = pil_im.size
print "width=%d and height=%d" % (width,height)
#獲得raw圖(圖像原始數據)
raw = pil_im.tostring()
# 將圖像原始數據封裝成zbar能識別的格式
image = zbar.Image(width, height, 'Y800', raw)
# 掃描圖像并識別圖像中的條碼及二維碼
scanner.scan(image)
# 結束計時,輸出整個識別過程的耗時
d2 = datetime.datetime.now()
d = d2-d1
print "time consuming: %dms"%(d.microseconds/1000)
# 提取識別結果
symbolPos = []
for symbol in image:
# 二維碼信息保存在symbol.data中
print 'decoded', symbol.type, 'symbol', '"%s"' % symbol.data
# 繪制二維碼的位置,左上為位置0,左下角為位置1,右下角為位置2,右上角為位置3
# 也就是說,二維碼的坐標是按照逆時針排列的
symbolPos = symbol.location
cv2.line(cv2_im, symbolPos[0], symbolPos[1], (0,0,255),2)
cv2.line(cv2_im, symbolPos[0], symbolPos[3], (0,0,255),2)
cv2.line(cv2_im, symbolPos[2], symbolPos[1], (0,0,255),2)
cv2.line(cv2_im, symbolPos[2], symbolPos[3], (0,0,255),2)
# 為了更好的顯示大圖像,我們需要將圖像縮小后顯示。如果你的圖像不大,可以
# 注釋掉如下代碼
show_image = cv2.resize(cv2_im,(width/2,height/2))
cv2.imshow("result",show_image)
# 獲取用戶的鍵盤輸入
key = cv2.waitKey(33) & 0xFF
# 清理資源
del(image)
編寫完程序后,我們將該python程序保存為zbar_example.py,然后我們在樹莓派桌面模式下,終端運行
python zbar_examply.py -i xxx.png
xxx.png是你要輸入的圖像。運行結果請參考博客開頭的截圖,有任何問題歡迎留言。
下圖是我用來測試的圖片,大家可以下載來測試用:
題外話
強烈建議大家在開發算法原形的時候,使用python語言,因為你可以借助numpy等強大的科學計算庫非常快的實現你的想法,你也可以使用matplotlib繪制精美的實驗結果圖。python能夠完成任何matlab能完成的圖像處理原形開發任務,但是python能做到的,matlab不一定能做到(比如寫網頁,寫Android應用)。千萬不要用 C++/C結合opencv來進行算法的原形開發,為什么?我用python的一句名言回答吧:生命很短,所以我用python,你需要快速的開發出算法原形,然后才是效率問題。numpy這類科學矩陣運算庫,都是用C實現的,我能說的是,99%的程序員都沒有能力實現一個比numpy,scipy更快的科學計算庫。所以有時候,我們花了幾個月把我們的python代碼轉換成C++并優化后,發現效率并沒有得到很大的提升。C/C++對于效率來說,不是靈丹妙藥,我倒是覺得向量化矩陣化,才是圖像處理的加速器。 如果你實在迫不及待要將你的python代碼轉換成C++代碼,一定要找一個效率高的C++矩陣運算庫,切忌不要以為用一個雙重循環就可以搞定圖像遍歷了。為什么我一直強調矩陣運算和操作,因為我們可以仔細想想,日常的圖像處理過程基本上都是以矩陣為單位的,我們需要大量的卷積,大量的滑動窗口操作。
總結
以上是生活随笔為你收集整理的树莓派python识别二维码_Zbar树莓派二维码(QR)识别(基于图片)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: vue+photoswipe
- 下一篇: 连载:涂鸦智能动手制作一款智能宠物喂食器