基于树莓派的Data Matrix decode
項目簡介
目前二維碼在生活中已經(jīng)得到了廣泛的應用,極大方便了我們的生活,例如支付寶支付二維碼,微信支付二維碼,那么二維碼有什么特點呢?二維條碼/二維碼(2-dimensional bar code)是用某種特定的幾何圖形按一定規(guī)律在平面(二維方向上)分布的黑白相間的圖形記錄數(shù)據(jù)符號信息的;在代碼編制上巧妙地利用構成計算機內部邏輯基礎的“0”、“1”比特流的概念,使用若干個與二進制相對應的幾何形體來表示文字數(shù)值信息,通過圖象輸入設備或光電掃描設備自動識讀以實現(xiàn)信息自動處理:它具有條碼技術的一些共性:每種碼制有其特定的字符集;每個字符占有一定的寬度;具有一定的校驗功能等。同時還具有對不同行的信息自動識別功能、及處理圖形旋轉變化點。本項目主要是完成DM碼解碼部分的工作,下圖為DM二維碼圖片示例
二維碼分類
按照碼制不同,二維碼可以分為許多種類,常見的有QR碼,DM碼,PDF417等等。下面將QR碼與DM碼做一些對比:DM無法表現(xiàn)漢字等其他形式,而QR碼能用數(shù)據(jù)壓縮方式來表示漢字,僅用13bit即可表示一個漢字,比其他二維條碼表示漢字的效率提高了20%。相較而言,DM碼信息容量小,應用簡單。而QR在漢字處理上更有優(yōu)勢。在糾錯能力上,QR碼具有四個不同等級的糾錯功能,即使破損即使彎曲或者有高達30%的殘缺也能夠正確識讀。顯示了其強大的糾錯能力,但DM在編碼破損上的表現(xiàn)得更為出色。它只需要讀取資料的20%即可精確辨讀。對少于255個字碼的DM二維條碼,錯誤糾正字碼可由資料字碼計算得出。對于多于255個字碼的符號,應將資料字碼分成多個模組,然后再產(chǎn)生每一個模組的錯誤糾正字碼。再看讀取速度與讀取角度的比拼。QR 碼的英文全稱是Quick Response Code,直譯為:快速響應編碼,由此看出,超高速識讀是 QR碼最顯著的特點,是QR Code碼區(qū)別其他二維碼的主要特性。據(jù)統(tǒng)計,用CCD二維條碼識讀設備,每秒可識讀30個含有100個字符的QR Code碼符號;而對于Data Martix矩陣碼,每秒僅能識讀2~3個符號。讀取角度上QR Code碼具有全方位(360°)識讀特點。而DM碼上沒有設置類似于QR碼的尋像圖形,因此只能在一個方向上讀取。
相應解碼庫介紹
1.zbar
zbar是一款開源的條形碼,二維碼解碼庫,支持windows系統(tǒng),linux系統(tǒng)和iphone平臺,可掃描以下類型:EAN-13/UPC-A, UPC-E, EAN-8, Code 128, Code 39, Interleaved 2 of 5 and QR Code.(注:zbar不支持DM碼的解碼,此處列出僅供了解)
2.zxing
zxing是一款開源java類庫,可用于解析多種格式的1D,2D條形碼,支持JAVA平臺,Android系統(tǒng)。(注:這個庫官方說明支持DM碼的編解碼工作,但是通過網(wǎng)上查資料了解到,用這個庫進行DM碼的解碼相關資料較少,而且并沒有成功解碼案例,也許是我沒找到)
3.libdmtx
經(jīng)過一定的曲折,發(fā)現(xiàn)了一個專門用于DM碼解碼的庫libdmtx,libdmtx也是一個開源庫,支持多種系統(tǒng),而且有豐富的語言封裝包,即wrappers,通過wrappers,我們可以用相應的語言來實現(xiàn)我們的方案。更詳細的說明和下面的一些內容在這個文檔里:libdmtx-wikidot.
編譯安裝
1.在把libdmtx庫文件夾拷進樹莓派用戶目錄以后,按照下列命令完成編譯安裝
chmod 777 configure ./configure make sudo make install2.把dmtx-wrappers文件夾放進樹莓派主目錄之后,進入dmtx-wrappers/python目錄,在命令行執(zhí)行下面命令完成安裝:
python setup.py install(注:由于系統(tǒng)自帶python2.7版本,所以python環(huán)境不需要額外搭建)
圖像處理之PIL庫和opencv庫的替換
在原始的dmtx-wrappers文件夾里 ,python封裝的測試程序,所用的圖形處理庫是PIL,考慮到opencv庫更加強大,和圖形預處理的需要,在DM碼解碼程序里需要用opencv代替PIL。這部分剛開始確實費了一些周折,但是搞清楚PIL相關程序語句在解碼程序里起的作用之后,就變得簡單了,下面給出替換前和替換后的程序,并進行一些簡單的注釋:
1.使用PIL庫
2.使用opencv
from pydmtx import DataMatrix # 導入解碼庫 import cv2 #調用opencv img=cv2.imread('hello.png') #獲取數(shù)字矩陣 print DataMatrix().decode(img.shape[0], img.shape[1], buffer(img.tobytes()))#解碼語句,前兩個參數(shù)是圖形尺寸,寬和高,第三個參數(shù)等價于上面第三個參數(shù)這里需要注意的是,由于要用opencv代替PIL,所以需要提前搭建python-opencv環(huán)境,詳細步驟參考人臉識別那個項目,本項目所用程序都在dmtx-wrappers/python目錄下.
總結拓展
其實到目前為止,我們實現(xiàn)的功能是,有一張規(guī)規(guī)矩矩的DM碼圖片,通過解碼程序將它解碼出來。而項目的實際流程可能是攝像頭不斷地拍攝圖片,得到一個個包含圖像信息的數(shù)字矩陣(此處不需要保存為一張圖片,從數(shù)字矩陣直接解碼,可以令解碼速度更快),然后進行圖像預處理,再解碼。
很遺憾,本項目也是做了很久才來補文檔,呃呃呃,記得當時實際操作的時候遇到了一個問題:那就是當程序運行一段時間,拍攝若干次之后,程序會崩潰,攝像頭在程序中斷運行之后,無法關閉。這個問題出現(xiàn)之后,折騰了好久仍然沒有解決,不過當時的自己給了解決問題的兩個方向(希望能對遇見類似問題的同學有所啟發(fā)):
1.如果繼續(xù)在樹莓派linux上操作,可以從opencv版本和內存泄露兩個方面著手,程序運行過程中,崩潰時出現(xiàn)select out 的錯誤,這個可能和opencv版本有關;程序中,當拍攝圖形分辨率設置越高時,即數(shù)字矩陣占用內存更大,程序崩潰前能拍攝圖形次數(shù)越少,感覺像是有一個固定的內存等于每次拍攝圖形所占內寸乘以拍攝次數(shù),當這個固定內存被占滿之后程序就崩潰,然而程序中又有釋放攝像頭的語句,所以很可能和內寸泄露有關。
2.可以在windows系統(tǒng)上運行,看能不能正常工作,如果可以則證明是平臺問題,再說其他的,如果不能正常工作,則證明是程序問題。在這里會出現(xiàn)一個新的問題,那就是雖然libdmtx庫是跨平臺的,可以在windows上運行,但是python的封裝wrappers不是跨平臺的,所以這里需要解決的問題是,你怎么使用自己擅長的語言在windows平臺上運行解碼程序。
總結
以上是生活随笔為你收集整理的基于树莓派的Data Matrix decode的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: QR码与DM码的区别
- 下一篇: matlab程序求反应谱,MATLAB程