Коротко — «идеальной, абсолютно без багов» библиотеки не бывает, но есть несколько очень надёжных, проверенных в продакшне решений. Что именно советовать — зависит от платформы и того, как вы сканируете (камера в реальном времени, скрин/фото, серверная обработка). Ниже — рекомендации по платформам и практические советы для случая «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 с терминала и укажите платформу/язык. Могу протестировать пару движков на этом изображении и подсказать конкретную библиотеку и набор предобработок, которые с большей вероятностью решат проблему.