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

Сканирование 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-код включает в себя несколько крупных квадратных элементов, которые служат для выравнивания и определения границ, задают формат столбцов, указывают номер версии и, разумеется, содержат сами закодированные данные.

Хранящаяся в них информация может иметь различные типы — числа, текстовые символы, двоичные данные, — что открывает широкие возможности для практического применения.

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

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

Для Python существует пакет qrcode, который позволяет оперативно кодировать информацию в QR-код и экспортировать результат как изображение. Установка выполняется командой:

pip3 install qrcode[pil]

Далее импортируем его в скрипт и формируем PIL-изображение следующим образом:

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

Полученное изображение можно сохранить в файл так:

code.save(<filename>.png)
Генерация QR-кода с помощью Python Сгенерированный QR-код

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

Параметры класса QRCode Настроенный QR-код

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

Страница с QR-кодами для печати

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

Выбор пал на 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.

Установка OpenCV на Raspberry Pi

Проверка корректности установки:

python3
import cv2
Проверка установки OpenCV

Чтение 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.