二维码的目标定位
1 總體思路
第一步,尋找二維碼的三個角的定位角點,需要對圖片進行平滑濾波,二值化,尋找輪廓,篩選輪廓中有兩個子輪廓的特征,從篩選后的輪廓中找到面積最接近的3個即是二維碼的定位角點。
第二步:判斷3個角點處于什么位置,主要用來對圖片進行透視校正(相機拍到的圖片)或者仿射校正(對網站上生成的圖片進行縮放拉伸旋轉等操作后得到的圖片)。需要判斷三個角點圍成的三角形的最大的角就是二維碼右上角的點。然后根據這個角的兩個邊的角度差確定另外兩個角點的右下和左上位置。
第三步,根據這些特征識別二維碼的范圍。
2 zbar處理流程
2.1 z型掃描圖像
對傳入圖像先進行逐行掃描,掃描路徑為 Z 字型(掃描兩遍,縱向也要掃),以一個像素點為增量在一行內一點一點掃描過去,并且完成濾波,求取邊緣梯度,梯度閾值自適應(注:一階差分計算閾值利于抗噪),確定邊緣(注:邊緣判定規則:二階導數為零的位置是一階時的最大值或最小值,因此認為是邊緣點;對二階導數符號發生變化的地方一定存在邊緣點),轉化成明暗寬度流
2.2 補充尋找邊緣
2.3 獲取寬度流
用當前邊緣跟上一次保存下來的邊緣相減得到一個寬度,并將其保存到掃描器結構變量scn中并將本次邊緣信息保存下
之后對掃描器結構變量scn中保存下來的明暗寬度流進行處理,處理對象為當前保存下來的寬度流,通過計算各寬度之間的寬度信息提取掃碼特征,依次通過幾種一維碼二維碼的檢測標準,尋找到符合標準的掃碼種類
2.4 尋找圖形中點
通過比例1:1:3:1:1對寬度流進行篩選并且據類之后求出橫向縱向線段的交叉點,求出圖形中點
2.5 仿射變換
仿射變換:https://www.cnblogs.com/happystudyeveryday/p/10547316.html
仿射變換(Affine Transformation) Affine Transformation是一種二維坐標到二維坐標之間的線性變換,保持二維圖形的“平直性”(譯注:straightness,即變換后直線還是直線不會打彎,圓弧還是圓弧)和“平行性”(譯注:parallelness,其實是指保二維圖形間的相對位置關系不變,平行線還是平行線,相交直線的交角不變。)
3 解碼階段
3.1 功能區解碼
通過仿射變換,求出了 QR 碼的版本碼字和模塊寬度(根據三個交叉點處于同邊的兩個點來計算,仿射變化有單應性仿射 affine homography 和全矩陣仿射 full homography ),將所求得的所有結果進行計算和比對,最終的出 QR 碼的版本結果,還需要判斷求出結果數是否大于等于 7 。如果是,求得的版本信息是經過編碼后的信息,版本號還需要解碼;如果小于 7 ,求出來的結果即是 QR 碼的版本號
之后求 QR 碼的格式信息,格式信息求出來之后就是 QR 碼的功能區到目前為止已全部識別并解碼出結果
3.2 數據區解碼
首先對對圖像進行消除掩模處理,并且識別出圖像中的定位圖案
然后將 QR 碼除去功能區之外的區域轉換為 0 和 1 的比特流
使用 Reed-Solomon 糾錯算法對提取出來的比特流進行校驗和糾錯,最后輸出最終的識別比特流。
對求出的比特流進行分析判斷,判斷當前 QR 碼屬于什么編碼模式,找到相應的編碼模式后對比特流進行解碼輸出,最終求得 QR 碼的解碼結果。
4 代碼實現
1.先通過opencv讀取視頻流中的幀,并將圖片轉換為灰度圖(大概率彩色圖片檢測不到二維碼)
? 2.再將灰度圖通過pyzbar庫中的decode函數進行譯碼操作,得到二維碼的信息,類型,坐標,寬度,高度,以及四個頂點的坐標獲取信息如下:
[Decoded(data=b’http://weixin.qq.com/r/vnW_pi3EcnANrWnF9yCs’, type=‘QRCODE’, rect=Rect(left=283, top=179, width=124, height=124), polygon=[Point(x=283, y=179), Point(x=283, y=303), Point(x=407, y=303), Point(x=407, y=179)])]
3.由于一個畫面中可能有多個二維碼,所以進行遍歷。在每次遍歷中提取二維碼的邊界框的位置以及二維碼數據 注:數據為字節對象,所以如果我們想在輸出圖像上畫出來,就需要先將它轉換成字符串,最后將邊框和信息在視頻流中顯示出來
5 參考資料
python3 + opencv +pyzbar實時檢測二維碼 / 定位二維碼,并繪制出二維碼的框和提取二維碼內容
二維碼的特征定位和信息識別
邊緣梯度
二維碼(QR code)基本結構及生成原理
zbar源碼分析–QR解碼過程分析
Zbar算法流程介紹
仿射變換(Affine Transformation)
pyzbar的github主頁:https://github.com/NaturalHistoryMuseum/pyzbar
pyzbar的pypi主頁:https://pypi.org/project/pyzbar/
總結
- 上一篇: 物理教育从名词谈起
- 下一篇: 深度学习-自动并行计算