發票二維碼掃描增強_02_算法概述


技術選型

為了解決二維碼無法掃描的問題,必須選擇合適的技術手段。由於我們的App引用的是別人開發的基於Zbar的圖像識別插件,在沒有能力修改圖像識別插件的前提下,我決定在服務端解決這個問題,考慮到算法的通用型,在服務端驗證通過的程序后期也可以考慮移植到App端,提高本地掃描速度,降低服務器性能消耗。IOS和Android的插件都存在相機對焦完成的事件,在該事件中可以拿到圖像信息,我計划在拿到對焦完成的圖片后,進行簡單壓縮后傳輸至服務器進行解析處理,再將服務器返回的解析結果作為解碼結果傳遞給前台應用。

對圖片的分析與操作屬於計算機圖形處理的范疇,OpenCV是一個非常強大的圖形處理庫,比較適合當前這個需求。因為之前也沒接觸過圖形處理這一塊,基本上也是邊學邊做,主要是從處理思想去找對應的圖形處理工具。

OpenCV支持多種語言,例如C++、Python,目前網絡上比較多的參考文檔都是基於C++,考慮到編程語言的簡易程度,決定采用Python進行開發。考慮到需要發布HTTP服務給App端調用,最終Python程序需要集成到Django項目中。

所以最后采用的技術棧為:Python3.6 + opencv-python + numpy(用於支持矩陣運算),使用pip安裝兩個庫:
pip install numpy
pip install opencv-python

思路分析

我們首先拿一張真實拍攝的二維碼進行分析:

這張圖片從肉眼來看,基本是一個正方形,用戶基本是攝像頭垂直於二維碼上方拍攝,而不是傾斜拍攝,比較符合我們對客戶的掃描結果預期。

如果我們可以拿到一張正方形的二維碼圖片,根據定位點和坐標點可以很容易構建坐標系去分割圖像,獲取每個點內的0/1值,從而構建一個新的二維碼圖像。

但是從該圖片去建立坐標系時,可以發現該圖片其實不是一個真正的正方形,並且連一個矩形都算不上,無法使用縮放的方式恢復正方形,從截圖的二維碼左右邊長和紅色框的長度比較可以看出來,左側線段長度要比右側線段短一些,所以連一個平行四邊形都不算,這在后面我們選擇圖形變換算法時也是一個非常重要的決定項。

我們梳理一下解決思路,對於一張正常拍攝的完整二維碼圖像,我們需要進行以下步驟的處理來解析圖像內容:
1.將圖像轉換成一個正方形
2.根據定位圖形和坐標點信息建立坐標系
3.根據坐標系切割圖像,並提取每一個單元格中的數據信息
4.根據提取的數據信息,重構一個標准的二維碼圖像

按照以上思路,我將程序主體拆分為以下三個部分,將在后續章節對每一個部分詳細介紹

1.圖像預處理
2.圖像坐標系構建
3.數據讀取和重構


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM