Logo Zephyrnet

Xây dựng Hệ thống xác thực người dùng với Máy quét mã QR sử dụng OpenCV

Ngày:

Bài báo này đã được xuất bản như một phần của Blogathon Khoa học Dữ liệu.

Thị giác máy tính đã mở ra rất nhiều khả năng và một trong những ứng dụng hàng ngày đơn giản và phổ biến nhất là sử dụng Mã QR và Máy quét mã vạch.

Máy quét mã QR sử dụng OpenCV

( Source: https://i.pinimg.com/736x/bb/55/b1/bb55b1a42f4e2cf6e80a0e275ad8b0c8.jpg )

Vậy, điều gì sẽ xảy ra khi bạn thanh toán ở siêu thị? Nhân viên thu ngân quét từng mặt hàng trong giỏ của bạn bằng một thiết bị và sau đó giá được tự động ghi lại trong hệ thống để tạo hóa đơn cho bạn. Thiết bị đó không có gì khác ngoài một máy quét mã QR / Mã vạch và đó chính xác là những gì chúng tôi sẽ chế tạo ngày hôm nay!

Trước khi đi sâu vào mã, chúng ta hãy tìm hiểu sơ qua về Mã QR và cách sử dụng của chúng.

Mã QR là gì?

Mã QR là viết tắt của Mã phản hồi nhanh. Nó là một loại mã ma trận được sử dụng phổ biến để theo dõi các mặt hàng. Mã QR lưu trữ dữ liệu dưới dạng pixel tương ứng với mã nhị phân có thể được hiểu để tiết lộ dữ liệu thực tế.

Đây là cấu trúc cơ bản của mã QR.

Mã QR

(Nguồn: https://en.wikipedia.org/wiki/File:QR_Code_Structure_Example_3.svg)

Mã QR tìm thấy ứng dụng của họ trong các lĩnh vực khác nhau như:

  1. Nhận dạng và xác thực nếu người dùng (thẻ ID)
  2. Theo dõi các mặt hàng riêng lẻ (Quản lý hàng tồn kho)
  3. Chia sẻ thông tin thanh toán (GPay, Paytm)
  4. Chia sẻ liên kết, hình ảnh, phương tiện

Một trong những ưu điểm chính của mã QR là dữ liệu có thể được chia sẻ ở dạng mã hóa mà không cần phải tiết lộ dữ liệu được mã hóa một cách rõ ràng. Điều này hoạt động như một lớp bảo vệ bổ sung để ngăn chặn việc lạm dụng thông tin nhạy cảm.

Mã vạch giống như Mã QR cũng là mã được mã hóa bằng máy có thể đọc được nhưng không giống như mã QR, dữ liệu được mã hóa dưới dạng các thanh có khoảng cách và độ dày khác nhau. Mã QR được coi là mã vạch 2D vì nó có thể lưu trữ dữ liệu theo cả chiều ngang và chiều dọc trái ngược với Mã vạch thường lưu trữ dữ liệu theo chiều ngang. Do đó Mã QR mạnh hơn Mã vạch.

Bây giờ chúng ta đã biết mã QR là gì, hãy bắt đầu với mã python của chúng ta.

Nhập các thư viện

Đối với dự án của chúng tôi, chúng tôi sẽ sử dụng OpenCV để đọc hình ảnh, lấy đầu vào luồng video và cũng hiển thị đầu ra của chúng tôi. Các thư viện chính mà chúng ta cần là pyzbar zbar thư viện để giải mã mã QR được mã hóa của chúng tôi. Đây là các thư viện python mã nguồn mở giúp giải mã mã vạch và mã QR. Chúng tôi cũng sẽ cần thư viện NumPy của chúng tôi. Chúng tôi phải thực hiện các cài đặt cần thiết.

import numpy as np from pyzbar.pyzbar import decode import cv2

Quét mã từ hình ảnh

Đầu tiên, chúng tôi sẽ đọc hình ảnh của Mã QR được lưu trong "qr1.png" với sự trợ giúp của thư viện cv2. Sau đó, với sự trợ giúp của phương pháp giải mã từ pyzbar, chúng ta hãy thử giải mã mã của mình và phân tích kết quả.

Đây là mã QR mà chúng tôi sẽ sử dụng làm “qr1.png”

Máy quét mã QR sử dụng OpenCV

(Nguồn: VectorStock.com/26810014)

# Đọc Mã QR từ Hình ảnh img = cv2.imread ("qr1.png") code = decode (img) print (code)

Đầu ra:

Đầu ra | Máy quét mã QR sử dụng OpenCV

Bây giờ, có rất nhiều thông tin được hiển thị. Hãy để chúng tôi hiểu từng phần của đầu ra của chúng tôi.

dữ liệu -> Trường này cung cấp cho chúng tôi văn bản hoặc thông tin được mã hóa trong Mã QR

gõ -> Trường này cho chúng ta biết loại mã QRCODE hoặc BARCODE

trực tràng -> Điều này cung cấp cho bên trái, trên cùng, chiều rộng và chiều cao của hình chữ nhật bao quanh hình ảnh QR. Ngay cả khi mã QR bị nghiêng, hình chữ nhật vẫn thẳng đứng cho chúng ta một hình chữ nhật bao quanh toàn bộ Mã QR

đa giác -> Điều này cung cấp cho chúng tôi các điểm góc chính xác của đa giác xung quanh hình ảnh QR. Nếu hình ảnh của mã QR bị nghiêng, thì đa giác bao quanh nó cũng vậy.

Đây là lý do tại sao chúng tôi sẽ sử dụng tọa độ của đa giác để vẽ hộp giới hạn của chúng tôi để ngay cả khi mã QR được xoay, chúng tôi vẫn có được ranh giới chính xác của mã.

Bây giờ, một bức ảnh có thể có nhiều mã QR. Vì vậy, chúng ta hãy đặt mã của mình trong một vòng lặp for để nó có thể phát hiện tất cả các mã vạch trong hình ảnh của chúng ta. Vì chúng tôi chủ yếu quan tâm đến thông tin được mã hóa, nên chúng tôi chỉ hiển thị văn bản được mã hóa.

đối với mã vạch trong giải mã (img): in (mã vạch.data) #in byte văn bản = mã vạch.data.decode ('utf-8') in (văn bản) in (mã vạch.rect)

Đầu ra

Đầu ra 2 | Máy quét mã QR sử dụng OpenCV

Dòng đầu tiên của kết quả hiển thị b'Hello! '. Dấu b biểu thị rằng nó là một byte theo nghĩa đen. Sau đó, nó được giải mã bằng cách sử dụng lược đồ 'utf-8' để chỉ lấy văn bản str.

Tuyệt quá! Bây giờ bạn đã giải mã thành công văn bản được mã hóa từ Mã QR.

Giải mã mã QR trong thời gian thực

Bây giờ, hãy thử thực hiện việc này trong thời gian thực bằng cách sử dụng đầu vào nguồn cấp dữ liệu máy ảnh. Hầu hết các ứng dụng trong đời thực như máy quét mã QR tại siêu thị, xác thực người dùng hoặc theo dõi một đối tượng sẽ yêu cầu chúng tôi giải mã mã theo thời gian thực. Vậy hãy bắt đầu!

Đoạn mã sau sẽ cho phép chúng tôi bật webcam và tạo một cửa sổ phụ cho đầu ra.

# Quét mã QR từ Nguồn cấp dữ liệu máy ảnh vid = cv2.VideoCapture (0) vid.set (3,640) vid.set (4,740)

Bây giờ, trong khi video đang bật, chúng tôi sẽ giải mã mã QR trong khung như chúng tôi đã làm trước đó. Ngoài ra, chúng tôi cũng sẽ sử dụng các điểm đa giác để vẽ các hộp giới hạn xung quanh mã QR của chúng tôi và hiển thị văn bản được giải mã tương ứng của chúng trên chính đầu vào khung máy ảnh.

trong khi True: thành công, img = vid.read () cho mã vạch trong giải mã (img): text = barcode.data.decode ('utf-8') print (text) polygon_Points = np.array ([barcode.polygon], np.int32) polygon_Points = polygon_Points.reshape (-1,1,2) direct_Points = barcode.rect cv2.polylines (img, [polygon_Points], True, (255,255, 0), 5) cv2.putText (img, text, (direct_Points [0], direct_Points [1]), cv2.FONT_HERSHEY_DUPLEX, 0.8, (255,255, 0), 2) cv2.imshow ("Video", img) cv2.waitKey (1)

Đầu ra

Đầu ra 3 | Máy quét mã QR sử dụng OpenCV

Trong đoạn mã trên, dòng

cv2.polylines (img, [polygon_Points], True, (255,255, 0), 5)

hiển thị hộp giới hạn xung quanh Mã QR của chúng tôi. 'img' chỉ định khung đầu vào. Lưu ý rằng ở đây chúng tôi đang sử dụng các điểm đa giác để ngay cả khi Mã QR được xoay, chúng tôi vẫn nhận được hộp giới hạn chính xác. (255,255,0) chỉ định màu của hộp giới hạn và 5 biểu thị độ dày.

Dòng mã

cv2.putText (img, text, (direct_Points [0], direct_Points [1]), cv2.FONT_HERSHEY_DUPLEX, 0.8, (255,255, 0), 2)

được sử dụng để hiển thị văn bản đã giải mã. Nếu quan sát kỹ, bạn sẽ thấy rằng ở đây chúng tôi đã sử dụng tọa độ của hình chữ nhật thay vì hình đa giác để hiển thị văn bản. Lý do của việc này là để đảm bảo rằng văn bản được hiển thị thẳng đứng bất kể mã QR có được xoay hay không để dễ đọc hơn.

Đầu ra này sẽ hiển thị cho chúng ta kết quả so sánh khi Mã QR thẳng đứng và khi nó được giữ ở phía trước máy ảnh ở một góc.

Thử nghiệm video | Máy quét mã QR sử dụng OpenCV

Hãy thử nghiệm nó trên một số đối tượng trong thế giới thực và xem nó có hoạt động không nhé!

thử nghiệm video trên những điều thực tế

Nó có! Hãy thoải mái thử nghiệm với càng nhiều mã QR bạn có thể tìm thấy xung quanh mình!

Một tính năng thú vị khác là thư viện này không chỉ có thể giải mã mã QR mà còn có thể giải mã Mã vạch mà không cần thực hiện bất kỳ thay đổi nào đối với mã của chúng tôi!

Hãy xem kết quả với đầu vào nguồn cấp dữ liệu máy ảnh mã vạch.

Kiểm tra mã vạch | Máy quét mã QR sử dụng OpenCV

Thì đấy! Bây giờ bạn đã xây dựng Máy quét mã vạch và mã QR của mình bằng cách sử dụng một số chức năng OpenCV đơn giản và thư viện pyzbar!

Bây giờ là phần thú vị! Thắt dây an toàn!

Xây dựng hệ thống xác thực người dùng

Hãy để chúng tôi thực hiện một tình huống sử dụng thực tế.

Mỗi nhân viên của một công ty nhận được một thẻ ID với mã QR tương ứng của họ. Một số nhân viên làm việc trong một dự án đặc biệt đã được cấp quyền truy cập vào một phòng thí nghiệm cụ thể trong khi đó là một khu vực hạn chế đối với những người khác. Mỗi nhân viên phải quét thẻ ID của họ ở lối vào để được vào phòng thí nghiệm.

Chúng tôi đã có Máy quét mã QR của mình. Bây giờ chúng ta hãy sử dụng tất cả những gì chúng ta đã học được cho đến nay. Chúng tôi sẽ xây dựng một Hệ thống xác thực người dùng đơn giản để kiểm tra xem Mã QR có thuộc về nhân viên được ủy quyền hay không và quyết định có cấp cho họ quyền truy cập hay không.

Vì vậy, hãy bắt đầu với mã!

import numpy as np from pyzbar.pyzbar import decode import cv2
# Quét mã QR từ Nguồn cấp dữ liệu máy ảnh vid = cv2.VideoCapture (0) vid.set (3,640) vid.set (4,740)

Các thư viện đã được nhập và quay video được thiết lập. Bây giờ chúng ta phải đọc tệp văn bản chứa các văn bản mã QR đã được giải mã cho nhân viên được ủy quyền và lưu trữ chúng trong một danh sách.

Hệ thống xác thực

Đây là tệp văn bản của chúng tôi “Authorised.txt”

với open ('Authorised.txt', 'r') dưới dạng tệp: auth_list = file.read (). dải () print (auth_list)

Đầu ra

Đầu ra

Để tham khảo, hãy chạy mã trước đó trên hình ảnh đầu vào của chúng tôi để hiển thị văn bản được giải mã cho mỗi Mã QR. Chúng tôi sẽ cần điều này sau, để xác minh xem mô hình của chúng tôi có hoạt động chính xác hay không. Hãy để chúng tôi xem xét kết quả đầu ra mà chúng tôi nhận được.

Đầu ra

Video Output

Bây giờ tất cả những gì chúng ta cần làm là kiểm tra từng Mã QR nếu văn bản được giải mã có trong danh sách Người được ủy quyền hay không. Nếu có sự trùng khớp, thì chúng tôi sẽ sử dụng màu Xanh lục (0,255,0) cho hộp giới hạn của chúng tôi và hiển thị văn bản “Đã cấp quyền truy cập” nếu không, chúng tôi sẽ sử dụng hộp giới hạn màu Đỏ (0,0, 255) và hiển thị thông báo "Truy cập trái phép".

trong khi True: thành công, img = vid.read () cho mã vạch trong giải mã (img): text = barcode.data.decode ('utf-8') text = str (text) nếu văn bản không có trong auth_list: color = (0,0,255 , 0,255,0) displaytext = "Truy cập trái phép" else: color = (32) displaytext = "Access Granted" polygon_Points = np.array ([barcode.polygon], np.int1,1,2) polygon_Points = polygon_Points.reshape (-2 , 3) direct_Points = barcode.rect cv2.polylines (img, [polygon_Points], True, color, 0) cv1.putText (img, displaytext, (direct_Points [2], direct_Points [0.9]), cv2.FONT_HERSHEY_PLAIN, 2, color, 2) cv1.imshow ("Video", img) cvXNUMX.waitKey (XNUMX)

Đầu ra

Quyền truy cập Được cấp hay không

Thanh danh! Bạn làm được rồi!

Mô hình của chúng tôi quét mã QR một cách hoàn hảo và chỉ cấp quyền truy cập cho những nhân viên được ủy quyền! Bạn đã xây dựng thành công Hệ thống xác thực người dùng bằng Trình quét mã QR chỉ cấp quyền truy cập cho nhân viên được ủy quyền sau khi họ quét mã QR trên thẻ ID của mình!

Có vô số trường mà Mã QR có thể thực sự hữu ích. Vì vậy, hãy tiếp tục và thử nghiệm thú vị với các mã khác nhau và các ứng dụng của chúng!

Về tôi:

Này, tôi là Tithi Sreemany. Hy vọng bạn thích đọc bài viết này và thấy nó hữu ích!

Bạn có thể liên hệ với tôi trên LinkedIn.

Hãy xem các bài viết khác của tôi ở đây: Link.

Nhờ đọc!

Phương tiện hiển thị trong bài viết này không thuộc sở hữu của Analytics Vidhya và được sử dụng theo quyết định riêng của Tác giả. 

Nguồn: https://www.analyticsvidhya.com/blog/2022/01/build-a-user-authentication-system-with-qr-code-scanner-using-opencv/

tại chỗ_img

Tin tức mới nhất

tại chỗ_img

Trò chuyện trực tiếp với chúng tôi (chat)

Chào bạn! Làm thế nào để tôi giúp bạn?