Какая хорошая библиотека для сканирования QR-кодов?

Посоветуйте надёжную, не содержащую багов библиотеку для сканирования QR‑кодов — например, сейчас используемая библиотека не распознаёт QR‑код, показанный на терминале.
  • 16 мая 2026 г. 12:00
Ответы на вопрос 2
Коротко — «идеальной, абсолютно без багов» библиотеки не бывает, но есть несколько очень надёжных, проверенных в продакшне решений. Что именно советовать — зависит от платформы и того, как вы сканируете (камера в реальном времени, скрин/фото, серверная обработка). Ниже — рекомендации по платформам и практические советы для случая «QR на терминале», когда изображение низкого качества/контрастности.

Рекомендации по библиотекам

- Мультиплатформенные / нативные:
  - ZXing (Zebra Crossing) — классика для Java/Android, стабильный и широко используемый. Для Android-UI удобно использовать обёртку com.journeyapps:zxing-android-embedded.
  - zxing-cpp — C++-реализация ZXing, подходит для десктопа/встраиваемых систем.
  - ZBar — быстрая и лёгкая C-библиотека, часто используется через обёртки (pyzbar для Python и т.п.).
  - Quirc — компактная и очень надёжная C-библиотека, часто показывает высокую устойчивость на «шумных»/низкокачественных изображениях.

- Мобильные (рекомендуемые для Android/iOS):
  - Google ML Kit (Barcode Scanning) — современное, быстрые и устойчивое решение от Google, хорошо работает на потоках с камеры.
  - iOS: AVFoundation / Vision (VNDetectBarcodesRequest) — нативные API Apple, быстрые и надёжные.

- Веб / JavaScript:
  - zxing-js/library — порт ZXing на JS.
  - qr-scanner (Nimiq) и jsQR — простые и быстрые для браузера; для лучшей устойчивости берите сборки с WebAssembly.

- Сервер / скрипты / Python:
  - pyzbar (обёртка ZBar) — простая для быстрого использования.
  - python + OpenCV + комбинация pyzbar/ZXing/Quirc — даёт больше контроля (предобработка).

Почему QR с терминала часто не читаются
- Низкая контрастность, мерцание, субпиксельные артефакты от шрифта/терминала.
- Маленький размер или плохая фокусировка камеры.
- Интерференция от окружения (блики, отражения).
- Скрин/фото имеют поворот/искривление, антиалиасинг или цветные фон/шрифт.

Практические советы (как повысить шансы распознавания)
1. Предобработка изображения:
   - преобразуйте в grayscale;
   - улучшите контраст (histogram equalization) или adaptive thresholding (в OpenCV: cv2.adaptiveThreshold);
   - увеличьте изображение (интерполяция) — маленькие коды трудно детектировать;
   - фильтрация шума (median/bilateral), нерезкая маска/усиление краёв;
   - исправьте перспективу (найдите контуры и сделайте warpPerspective).

2. Параметры съёмки:
   - увеличьте разрешение кадра/фото;
   - дайте камере время сфокусироваться, избегайте автоэкспозиции/мерцания;
   - если возможно, временно увеличить яркость терминала или использовать другой фон (убрать цветные элементы).

3. Алгоритмические приёмы:
   - пробуйте несколько движков (например, сначала ML Kit, потом Quirc/ZBar/ZXing) — комбинация повышает шанс;
   - поворачивайте изображение на 90/180/270° и повторно пробуйте (некоторые реализации не всегда корректно обрабатывают ориентацию);
   - если сканируете поток — накапливайте несколько кадров и объединяйте/усредняйте для повышения качества.

Рекомендации для вашего случая (QR на терминале)
- Если вы сейчас используете ZXing и он не срабатывает — попробуйте Quirc или ZBar; Quirc особенно хорош на «плохо отрисованных» кодах.
- Если это мобильное приложение — попробуйте ML Kit (Android/iOS) или нативные API (iOS Vision), они лучше справляются с реальным видеопотоком.
- Если это веб-камера в браузере — попробуйте qr-scanner (Nimiq) или zxing-js + предобработку кадра в canvas перед распознаванием.

Если хотите — пришлите пример изображения/фото QR с терминала и укажите платформу/язык. Могу протестировать пару движков на этом изображении и подсказать конкретную библиотеку и набор предобработок, которые с большей вероятностью решат проблему.
а я б сначала проверил — QR на терминале не инвертированный? Многие либы на это и падают. Если нет — @yudiel/react-qr-scanner, там camera constraints нормально настраиваются.
Похожие вопросы