在 Python 中使用 OpenCV 建立二維碼掃描器
我們都熟悉不同產品中存在的條形碼。基於摩爾斯電碼,條形碼通過使用線條和空格表示資訊來儲存資訊,並水平儲存資料。
最近,二維碼也開始流行起來。QR 碼儲存在一個盒子中,並使用帶有一些點的黑白方塊組合來表示。
它也是基於摩爾斯電碼的,所以它可以被認為是一種條形碼矩陣。
二維碼在儲存方面優於傳統條碼。它以兩個方向儲存資料;因此它可以包含比條形碼更多的資訊。
此資訊可以是 URL、聯絡人和其他最多四千個字元的資訊。現在幾乎每部手機都有一個二維碼掃描器的應用程式。
本教程將演示如何使用 Python 中的 OpenCV 庫建立二維碼掃描器。
OpenCV 庫包含可以有效儲存和處理影象的不同功能和類。我們可以在我們的框架中應用廣泛的預定義技術。
使用 QRCodeDetector
類在 Python 中使用 OpenCV 建立二維碼掃描器
OpenCV 庫的 4.0.0 版引入了 QRCodeDetector
類。此類包含可用於檢測和掃描影象以獲取 QR 碼的方法。
我們可以使用不同的方法掃描單個和多個二維碼。
此類中的 detect()
方法用於掃描影象中的二維碼;它會找到包含 QR 碼的框。decode()
方法對檢測到的二維碼進行解碼。
要檢測給定影象中的多個 QR 碼,我們可以使用 detectMulti()
和 decodeMulti()
函式。為了檢測和解碼曲面上的程式碼,我們分別使用 detectCurved()
和 decodeCurved()
方法。
我們可以使用 detectandDecode()
函式同時檢測和解碼影象中的程式碼。對於此方法,還存在 detectandDecodeCurved()
和 detectandDecodeMulti()
方法。
現在讓我們使用這個類建立一個非常簡單的二維碼,並將掃描下圖中的二維碼:
請參閱下面的程式碼。
import cv2
img = cv2.imread("2.jpg")
det = cv2.QRCodeDetector()
info, box_coordinates, _ = det.detectAndDecode(img)
if box_coordinates is None:
print("No Code")
else:
print(info)
if box_coordinates is not None:
box_coordinates = [box_coordinates[0].astype(int)]
n = len(box_coordinates[0])
for i in range(n):
cv2.line(
img,
tuple(box_coordinates[0][i]),
tuple(box_coordinates[0][(i + 1) % n]),
(0, 255, 0),
3,
)
cv2.imshow("Output", img)
cv2.waitKey(0)
cv2.destroyAllWindows()
輸出:
http://sampleurl.com
在上面的示例中,我們建立了 QRCodeDetector
類的物件,並使用 detectandDecode()
函式掃描和解碼給定影象中的 QR 碼。該函式返回顯示的二維碼資訊。
它還返回了圍繞 QR 碼的框的座標。我們使用 line()
函式使用這些座標在影象上繪製其邊界。
顯示最終影象,我們使用 waitKey()
和 destroyAllWindows()
函式來防止此視窗自動關閉,並等待使用者在關閉它之前按下某個鍵。
在我們的示例中,我們從目錄中讀取影象並掃描 QR 碼。我們可以通過使用網路攝像頭並從那裡讀取影象來使其更具互動性。
OpenCV 提供了 VideoCapture
類來捕捉和讀取網路攝像頭的視覺效果。
まとめ
本教程演示了使用 Python 的 OpenCV 庫建立一個簡單的二維碼掃描器。我們首先討論了 QR 碼的基礎知識、它與條形碼的比較以及它可以儲存的資訊。
我們簡要討論了 OpenCV 庫中的 QRCodeDetector
類,它提供了許多從影象中檢測和解碼 QR 碼的方法。我們提供了一個簡單的 QR 碼掃描器示例,使用此類掃描和解碼給定影象中的 QR 碼。
Manav is a IT Professional who has a lot of experience as a core developer in many live projects. He is an avid learner who enjoys learning new things and sharing his findings whenever possible.
LinkedIn