Иван Иванов   6 марта в 14:24

Сканирование QR-кодов в режиме реального времени с Raspberry Pi

Используем веб-камеру и Raspberry Pi 4 для извлечения информации из QR-кодов, создаем собственный код на Python.

Комплектующие

Для считывания и создания QR-кодов нам понадобятся следующие комплектующие и программное обеспечение.

  1. Raspberry Pi 4 Model B × 1
  2. Raspberry Pi Camera Module V2 × 1
  3. Microsoft VS Code
  4. Python 3.6

Как работают QR-коды

Quick Response Code или код быстрого реагирования аналогичны штрих-кодам, поскольку они способны кодировать данные, представленные черными и белыми квадратами. Но вместо того, чтобы использовать лазер, камера различает пробелы и затем отправляет эту информацию на обработку.

Они состоят из нескольких больших квадратов, которые помогают выровнять и расположить края QR-кода, отформатировать столбцы, номер версии и, наконец, сами данные.

Содержащиеся в них данные могут кодировать различные типы, включая числа, символы и двоичные файлы, что позволяет использовать их в творческих целях.

Рекламодатели часто кодируют в них URL-адреса, которые перенаправляют пользователя на их веб-сайт. Другие компании могут разместить важную информацию о продукте в QR-коде, например, серийный номер, и прикрепить ее к компоненту.

Генерируем с помощью Python

Существует пакет Python под названием qrcode, который позволяет пользователям быстро кодировать данные внутри QR-кода, а затем экспортировать их в виде изображения. Чтобы установить его, запустите:

pip3 install qrcode[pil]

Затем вы можете импортировать его в скрипт и сгенерировать изображение PIL с помощью:

import qrcode
code = qrcode.make('Hello world!')

Затем изображение можно экспортировать в файл с помощью:

code.save(<filename>.png)

Вы можете дополнительно настроить свои коды с помощью класса QRCode, который предоставляет такие параметры, как размер, количество исправлений ошибок, версия и ширина границы.

Теперь, когда все ваши собственные QR-коды созданы, соберите их на одной странице и распечатайте.

Настройка Raspberry Pi 4

Я решил использовать Raspberry Pi 4 из-за его возможностей, которые могут немного повысить скорость работы приложения при чтении изображений.

Я установил Raspbian, загрузив образ ОС и перепрошив его с помощью Balena Etcher. Затем я подключился к нему через SSH и установил OpenCV:

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

Последняя команда позволяет вам использовать Picamera с OpenCV VideoCapture.

Я проверил успешность установки:

python3
import cv2

Чтение QR-кодов

Код работает следующим образом:

  1. Настройка камеры и определить QR-код.
  2. Считать код в новом кадре и извлечь QR-код
  3. Если есть код, нарисовать рамку вокруг него и отобразить его данные выше.
  4. Если клавиша выхода q не была нажата, вернуться к шагу 2.

Программа также показывает обновленный кадр с наложенной графикой при каждом обновлении.

import cv2

cap = cv2.VideoCapture(0)

detector = cv2.QRCodeDetector()

while True:
    _, img = cap.read()
    data, bbox, _ = detector.detectAndDecode(img)
    
    if(bbox is not None):
        for i in range(len(bbox)):
            cv2.line(img, tuple(bbox[i][0]), tuple(bbox[(i+1) % len(bbox)][0]), color=(255,
                     0, 255), thickness=2)
        cv2.putText(img, data, (int(bbox[0][0][0]), int(bbox[0][0][1]) - 10), cv2.FONT_HERSHEY_SIMPLEX,
                    0.5, (0, 255, 0), 2)
        if data:
            print("data found: ", data)
    cv2.imshow("code detector", img)
    if(cv2.waitKey(1) == ord("q")):
        break
cap.release()
cv2.destroyAllWindows()

Поскольку QR-коды очень полезны для отслеживания множества различных деталей, например, на складе, я планирую использовать их для отслеживания своего оборудования типа коробки резисторов или плат Arduino.