Quét mã QR thời gian thực với Raspberry Pi Camera

Quét mã QR thời gian thực với Raspberry Pi Camera

11:21 - 14/12/2020

Sử dụng Raspberry Pi Camera như một máy quét mã QR.

Chào đón Raspberry Pi Pico phiên bản MCU Board đầu tiên đến từ Raspberry Pi Foundation
Remote Desktop NVIDIA Jetson Nano không cần Wifi, mạng LAN và IP
Hệ thống cảnh báo đeo khẩu trang phòng chống dịch COVID-19 đơn giản với OpenCV và Keras
Cảm biến nhiệt độ hồng ngoại không tiếp xúc và ứng dụng trong mùa dịch Covid-19
Camera nhiệt giải pháp tuyệt vời cho mùa Covid-19

Giới thiệu


QR code viết tắt của Quick response code (“Mã phản hồi nhanh”) hay còn gọi là mã vạch ma trận (matrix-barcode) là dạng mã vạch hai chiều (2D) có thể được đọc bởi một máy đọc mã vạch hay smartphone có chức năng chụp ảnh với ứng dụng chuyên biệt để quét mã vạch. Đây là một nhãn quang học chứa thông tin trên các gói thực phẩm, danh thiếp, trang web hoặc quảng cá nào đó có thể đọc được bằng máy quét QR. Sau khi quét mã QR từ thiết bị của mình, người dùng có thể tự động truy cập vào liên kết được nhúng trong thiết bị. Ngoài các liên kết, mã có thể chứa thông tin sản phẩm, số điện thoại, địa chỉ email, tọa độ hoặc tên công ty...  Hệ thống QR trở nên phổ biến do khả năng đọc nhanh và dung lượng lưu trữ lớn hơn so với mã vạch UPC tiêu chuẩn. Trong hướng dẫn này, Chúng ta sẽ cùng nhau tìm hiểu cách sử dụng Raspberry Pi Camera để trích xuất thông tin từ mã QR.


Cách thức hoạt động của mã QR


Mã phản hồi nhanh (QR code) tương tự như mã vạch, vì chúng có thể mã hóa dữ liệu được biểu thị bằng các ô vuông đen và trắng. Nhưng thay vì sử dụng tia laser, chúng ta có thể sử dụng một máy ảnh để phân biệt giữa các không gian và từ đó chúng ta sẽ trích xuất các thông tin cần thiết. Cụ thể mã QR bao gồm một số hình vuông lớn giúp căn chỉnh và định vị các cạnh của mã QR này, các cột định dạng, số phiên bản và cuối cùng là chính dữ liệu.


Danh sách thiết bị cần có : 

+ 1 Raspberry Pi 4 Model B

+ 1 Nguồn 5V 3A cho Raspberry Pi 4

+ 1 Thẻ nhớ MicroSD ( Có các tùy chọn từ 32GB đến 256GB)

+ 1 Raspberry Pi Camera (Trong bài viết này chúng ta sẽ sử dụng Raspberry Pi Camera V2)


Quét mã QR với Raspberry Pi 4 

Thiết lập cho Raspberry Pi 4


Chúng ta sẽ chọn sử dụng Raspberry Pi 4 với những nâng cấp đáng kể so với phiên bản trước thì đây là một lựa chọn có thể giúp ứng dụng tăng một chút tốc độ khi đọc hình ảnh.

Đầu tiên chúng ta cần cài đặt hệ điều hành Raspbian. Hướng dẫn chi tiết (LINH HERE).

Tiếp đến chúng ta sẽ tiến hành cài đặt OpenCV cho Raspberry Pi 4:

sudo apt-get update

sudo apt-get install python3-opencv

sudo apt-get install libqt4-test python3-sip python3-pyqt5 libqtgui4 libjasper-dev libatlas-base-dev -y

pip3 install opencv-contrib-python==4.1.0.25

sudo modprobe bcm2835-v4l2

Lệnh cuối cùng cho phép bạn sử dụng picamera với OpenCV VideoCapture.

Kiểm tra xem việc cài đặt đã thành công bằng lệnh : 

python3

import cv2


Đọc mã QR


Chúng ta cần kết nối camera với Raspberry Pi 4 và thiết lập camera theo hướng dẫn (LINK HERE)

Cách thức hoạt động như sau:

- Thiết lập Camera và QR code detector

- Đọc khung hình mới và trích xuất QR code

- Nếu có mã trong khung hình, tiến hành vẽ một box xung quanh mã này và hiển thị dữ liệu đọc được.

- Nhấn phím 'q' để thoát chương trình 


Demo Code :


1. Đọc mã QR và hiển thị thông tin


  1. import cv2
  2.  
  3. # set up camera object
  4. cap = cv2.VideoCapture(0)
  5.  
  6. # QR code detection object
  7. detector = cv2.QRCodeDetector()
  8.  
  9. while True:
  10.     # get the image
  11.     _, img = cap.read()
  12.     # get bounding box coords and data
  13.     data, bbox, _ = detector.detectAndDecode(img)
  14.  
  15.     # if there is a bounding box, draw one, along with the data
  16.     if(bbox is not None):
  17.         for i in range(len(bbox)):
  18.             cv2.line(img, tuple(bbox[i][0]), tuple(bbox[(i+1) % len(bbox)][0]), color=(255,
  19.                      0, 255), thickness=2)
  20.         cv2.putText(img, data, (int(bbox[0][0][0]), int(bbox[0][0][1]) - 10), cv2.FONT_HERSHEY_SIMPLEX,
  21.                     0.5, (0, 255, 0), 2)
  22.         if data:
  23.             print("data found: ", data)
  24.     # display the image preview
  25.     cv2.imshow("code detector", img)
  26.     if(cv2.waitKey(1== ord("q")):
  27.         break
  28. # free camera object and exit
  29. cap.release()
  30. cv2.destroyAllWindows()

2. Đọc mã QR và lưu vào file .csv


Tạo file Database.csv với nội dung như hình : 

 

Các bạn có thể vào đây để tạo mã (LINK HERE)

Các bạn có thể test vs một vài mã sau :

  1. import cv2
  2. import csv
  3.  
  4. # set up camera object
  5. cap = cv2.VideoCapture(0)
  6. # QR code detection object
  7. detector = cv2.QRCodeDetector()
  8.  
  9. print("Scan QR code using Raspberry Pi Camera")
  10. print("------------------------------")
  11.  
  12. while True:
  13.      # get the image
  14.     _, img = cap.read()
  15.      # get bounding box coords and data
  16.     data, bbox, _ = detector.detectAndDecode(img)
  17.     # if there is a bounding box, draw one, along with the data    
  18.     if(bbox is not None):
  19.         for i in range(len(bbox)):
  20.             cv2.line(img, tuple(bbox[i][0]), tuple(bbox[(i+1) % len(bbox)][0]), color=(255,
  21.                      0, 255), thickness=2)
  22.         cv2.putText(img, data, (int(bbox[0][0][0]), int(bbox[0][0][1]) - 10), cv2.FONT_HERSHEY_SIMPLEX,
  23.                     0.5, (0, 255, 0), 2)
  24.         #extract information from QR codes    
  25.         if data:
  26.             print("data found: ", data)    
  27.             data = data.split(",")
  28.             print("ID: " + data[0])
  29.             print("NAME: " + data[1])
  30.             print("CLASS: " + data[2])
  31.             print()
  32.             #if the same QR code is detected, do not save the data  
  33.             userScanned = False
  34.             with open('Database.csv'as csvfile:
  35.                 reader = csv.DictReader(csvfile)
  36.                 for row in reader:
  37.                     if row['ID'== data[0]:
  38.                         userScanned = True
  39.             #write data to file Database.csv        
  40.             if userScanned == False:
  41.                 with open('Database.csv', 'a'as csvfile:
  42.                     fieldNames = ['ID', 'NAME', 'CLASS']
  43.                     writer = csv.DictWriter(csvfile, fieldnames=fieldNames)
  44.                     writer.writerow({'ID': data[0], 'NAME': data[1], 'CLASS': data[2]})
  45.     # display the image preview            
  46.     cv2.imshow("code detector", img)
  47.     if cv2.waitKey(1== ord("q"):
  48.         break
  49. # free camera object and exit
  50. cap.release()
  51. cv2.destroyAllWindows()


Như vậy hôm nay mình và các bạn đã cùng nhau tìm hiểu cách thức hoạt động của mã QR và sử dụng Raspberry Pi Camera để đọc mã một cách nhanh chóng. Mình rất mong các bạn có thể áp dụng cho các ứng dụng liên quan đến việc quét mã QR. 


Nếu các bạn có bất kỳ ý tưởng mới cũng như đóng góp nào đừng ngần ngại mà hãy inbox trực tiếp cho fanpage . Xin chào và hẹn gặp lại các bạn trong các bài viết tiếp theo !!!


PIVIETNAM.COM.VN CHÚC CÁC BẠN THÀNH CÔNG !!!

Thực hiện bài viết : Đào Văn Hậu


Để cập nhật các tin tức công nghệ mới các bạn làm theo hướng dẫn sau đây :


Các bạn vào Trang chủ >> Tin tức. ở mục này có các bài viết kỹ thuật thuộc các lĩnh vực khác nhau các bạn có thể lựa chọn lĩnh vực mà mình quan tâm để đọc nhé !!!

Các bạn cũng có thế kéo xuống cuối trang để xem những tin tức công nghệ mới nhất.