Я хочу прочитать серийный номер с переменной длиной и базой-36, закодированный с использованием оптического распознавания символов. Так как могут возникнуть ошибки, может быть добавлен один символ для проверки избыточности цикла или в качестве контрольной суммы. Один закодированный на основе символов 36 может содержать 36 различных чисел в качестве контрольной суммы.OCR серийный номер CRC, алгоритм проверки
Серийный номер примера: СПГ TZ746B8 + один контрольный символ (основание-36)
На данный момент я попытался различные алгоритмы, такие как Luhn Mod N (36) алгоритма.
CRC
CRC наиболее часто используется для битовых ошибок при обнаружении сетевых передач, где самая высокая вероятность того, что один бит изменения. В теме распознавания серийного номера OCR более вероятной ошибкой распознавания является ложное распознавание символа «8» Ascii (двоичный 00111000) вместо символа «B» (двоичный код 01000010), приводит к более чем одной ошибке с одним битом , В CRC в качестве параметра для обнаружения ошибок используется значение Хэмминга (HD). Внутри ранее описанного полинома 0x05 для разделения CRC используется HD около 3-4, что приводит к необнаруженной ошибке, если больше бит изменяется. HD Source
Какой полином был бы лучшим или какой алгоритм контрольной суммы можно было бы использовать? В настоящий момент я достигаю наилучших результатов с использованием реализации CRC с повышением и 0x05 в качестве полиномиального деления для 5-битного CRC (для 36 символов требуется 6 бит, но последний бит не используется полностью. Для тестирования я использую только полные 5 бит = 31 разные символы). Список полиномов Wiki Polynomials
ключевые слова
Каких ключевых слов можно использовать, чтобы найти информацию в Интернете о теме обнаружения ошибок в системах оптического распознавания символов? Где можно найти статистику наиболее вероятных ошибок распознавания с помощью OCR? (Как и Е/3, B/8, ошибка.)
Проблема в использовании CRC
36 различных числа потребностей 7 бит, в результате чего не все 7 бит используются. 7 бит могут содержать до 63 номеров. Поэтому я должен по модулю (%) получить результат CRC или использовать только 6-битный многочлен. Исходя из этого, моя точность результатов падает, когда я использую модуль. Причина этого заключается в том, что большее количество бит может содержать более разные контрольные суммы, и поэтому происходит меньшее количество столкновений.
Кроме того, у меня есть проблема, что с помощью специальных символов OCR, таких как N/M, 3/E, B78, можно легко распознать ложь. Поскольку мое требование состоит в том, чтобы распознать все символы до 100%, исправлена контрольная сумма или алгоритм CRC, чтобы предотвратить ложное распознавание без обнаружения.
Дальнейшая проблема заключается в том, что разные серийные номера, например серийный номер «S95I» и «5951», приводят к одной и той же контрольной сумме «GP». Поскольку OCR подвержено ошибкам распознавания ошибок 5/S, такая контрольная сумма не должна возникать.
Другие примеры для той же контрольной суммы символов.
Nr.1 - Nr.2 - Checksum 1 and 2
BSHB - 85H8 - KA - KA
BSJ8 - 85JB - IC - IC
BSJ8 - 85JB - IC - IC
BSQ8 - 85QB - KC - KC
BSQ8 - 85QB - KC - KC
BSSB - 85S8 - IA - IA
BS1B - 8518 - ES - ES
BS38 - 853B - GQ - GQ
BB7I - 8871 - E0 - E0
BB7I - 8871 - E0 - E0
B930 - 89EO - BI - BI
9331 - 9EEI - EQ - EQ
9EEI - 9331 - EQ - EQ
В моей реализации я использую алгоритм подталкивания CRC, который можно найти здесь Boost CRC:
string data = "S95I";
boost::crc_optimal<11, 0x571> crc;
crc.process_bytes(data.data(), data.size());
stringstream checksum;
checksum << (int)crc() % 1296;
string resultCheck = checksum.str();
Я хотел бы знать, если есть другие алгоритмы с более низкой возможностью столкновений или другими возможностями для реализации контрольных сумм.
Если у вас есть какие-либо вопросы, или я не объяснил, что я недостаточно хорошо, пожалуйста, не стесняйтесь отвечать. Я постараюсь ответить как можно скорее.
Большое спасибо, Кристофа
Я знаю, что добавление больше контрольных символов приводит к большему количеству комбинаций можно чековых и далее к меньшему количеству столкновений. К сожалению, я не могу использовать более одного контрольного персонажа для своей цели. Что касается второго фрагмента кода, могу ли я правильно вычислить символ проверки только на «критических» символах и пропустить другие символы для расчета? –
Если это все, о чем вы заботитесь. Обратите внимание, что подход, включающий только подверженные ошибкам символы, приведет к тому, что все строки, которые не используют ни один из этих символов, не столкнутся с одним значением проверки. Это может быть слишком высокой ценой, в зависимости от скорости других ошибок. –
Хорошо, я вижу. Во время этого сообщения мои требования к алгоритму проверки изменились (два-один контрольный символ, уже обновленные вопросы), я хочу использовать только отдельные контрольные символы, добавленные к серийному номеру. Моя идея состояла в том, что, возможно, существует специальный алгоритм или методы контрольной суммы OCR, которые лучше подходят для моей цели. Я знаю, что только с одним контрольным символом я не могу получить 100% правильный алгоритм проверки, но это не моя идея. Я хотел бы получить лучший метод только для одного контрольного символа и уметь распознавать большинство известных ошибок распознавания во время OCR. –