Тогда я нарисовал удава изнутри, чтобы взрослым было понятнее. Им ведь всегда нужно всё объяснять.
Антуан де Сент-Экзюпери, «Маленький принц»

Введение

Указатели населённых пунктов всегда были для меня источником маленьких открытий. Первые наблюдения появились во время длинных велосипедных поездок — тех, где усталость неизбежно приводит к философским размышлениям.

Дорожные знаки из коллекции.
Дорожные знаки из коллекции.

В моменты монотонного движения я развлекался простой игрой: составлял слова (часто непечатные), убирая одну-две буквы с дорожных указателей. Иногда получалось забавно — настолько, что я останавливался, чтобы сфотографировать результат, прикрыв часть знака пальцем. Но со временем взгляд начал цепляться совсем за другое.

Некоторые буквы О выглядели… не как буквы.

Аномалия

На ряде указателей О была слишком узкой, вытянутой, «неживой». Казалось, она выбивается из общего стиля. При этом на соседних указателях всё выглядело нормально.

Что-то не так...
Что-то не так...

Большинство людей, которым я показывал эту аномалию, не видели ничего необычного. Но ощущение оставалось: где-то здесь есть закономерность.

Постепенно появилась гипотеза: на некоторых указателях вместо буквы О используется цифра 0.
Звучит почти как теория заговора, но проверяется вполне технически.

Чем отличаются О и 0

В большинстве шрифтов символы отрисованы со следующими отличиями:

  • буква О шире, имеет более округлую форму;

  • цифра 0 уже и вытянутее;

  • в моноширинных шрифтах различие создают дополнительные точки, штрихи или особая форма контура.

Примеры различий символов в разных шрифтах.
Примеры различий символов в разных шрифтах.

Как видим, есть разные причины, по которым глаз может воспринимать символы как О или 0, но в основном это пропорции высоты и ширины.

Не очень хотелось для каждого измерения или проверки гипотезы ездить и мерить знаки. А воровать их на время исследования в мои планы не входило. Поэтому, вместо простого измерения указателей рулеткой, будем их фотографировать, чтобы иметь возможность комфортно их измерить — ну и иметь пруфы, конечно.

Но чтобы сравнить символы корректно, нужно получить их изображение без искажений.

Получение изображений знаков

Определяем направление

Обычное фото даёт сильные перспективные искажения, зависящие от угла, расстояния.
Если мы хотим измерять высоту и ширину символов, фотографии нужно нормализовать. То есть получить изображение, соответствующее реальной плоскости и размерам знака, чтобы исключить расхождение относительных размеров на фото и в реальности.

Для этого нужна простая система калибровки — набор опорных точек, расположенных заранее известным образом.

Проверка метода трансформации

Чтобы проверить, можно ли корректно исправлять перспективу, я собрал тестовый "знак". Взял деревянную раму для стабильности плоскости и закрепленный на нее картон с сеткой известного размера.

Макет для тестирования исправления искажений объектов на фото.
Макет для тестирования исправления искажений объектов на фото.

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

Какие маяки использовать

Первоначально я думал использовать "Finder pattern" элементы из QR-кодов, но не нашел библиотечных функций в OpenCV для их поиска на изображении.
Поэтому выбрал ArUco-маркеры — они созданы немного для других задач, но отлично распознаются библиотекой и визуально прекрасны.

Тестируем разные виды маяков для привязки.
Тестируем разные виды маяков для привязки.
Тестируем исправления искажений по ArUco маякам
Тестируем исправления искажений по ArUco маякам
Первые тестовые результаты обнаружения маркеров.
Первые тестовые результаты обнаружения маркеров.

Матрица для работы в поле

На этом этапе я понял: нужно сделать устройство, которое можно быстро приложить к любому дорожному знаку, сфотографировать и поехать дальше.

Так появилась деревянная рама с ArUco-маркерами и магнитами — матрица, которую можно буквально “пристегнуть” к металлическому знаку.

Процесс.
Процесс.
Первые результаты и тесты. На фото слева виден набор магнитов.
Первые результаты и тесты. На фото слева виден набор магнитов.

Сбор данных

Для исследования я просто выехал куда глаза глядят и собрал десяток снимков знаков. Далеко ехать не пришлось — нашлись как «правильные», так и «неправильные».

Первый улов. Режет глаз на 50%
Первый улов. Режет глаз на 50%

Матрица хорошо работала, за исключением единственного перекрученного знака, к которому магниты не липли. Пришлось использовать человеческие подпорные руки.

Обработка изображений

Опорные точки задают прямоугольник 1200×500 мм.
Алгоритм обработки каждого кадра был следующим:

  1. распознать маркеры на фото;

  2. трансформировать изображение в плоскость по маркерам;

  3. вырезать участок с символом О/0 (пришлось сделать руками);

  4. очистить шум и бинаризовать;

  5. повернуть символ горизонтально (используя минимальный описывающий прямоугольник).

Обрезанные по опорным точкам части изображений с исправленными искажениями.
Обрезанные по опорным точкам части изображений с исправленными искажениями.

Вот так выглядят выравненные символы:

5 колец. Почти олимпийских.
5 колец. Почти олимпийских.

Измерения

Далее — автоматическое измерение ширины, высоты и вычисление их отношения.

Результат:

filename

width

height

width_height_ratio

zero-lahoisk-5-black.png

202

304

0.664

zero-true-zero.png

418

619

0.675

zero-ushodnyaya.png

413

612

0.675

zero-zadomlya.png

214

315

0.679

zero-hrodna-1.png

423

624

0.678

letter-kudrishchena-black.png

158

208

0.760

letter-zadomlya-open-black.png

237

311

0.762

letter-lagozhnsk-black.png

233

299

0.779

letter-lahoisk-smalyavichy.png

168

217

0.774

letter-lahoisk-vitsebsk.png

254

324

0.784

letter-plyacouka.png

334

426

0.784

letter-zhodzina-1.png

339

432

0.785

letter-zhodzina-circle.png

256

325

0.788

Выводы:

  • ширина буквы О = 76–79% высоты;

  • ширина цифры 0 = 66–68% высоты.

Символы, распознаваемые глазом как О. Символы, распознаваемые глазом как ноль. Оба типа символов.
Символы, распознаваемые глазом как О. Символы, распознаваемые глазом как ноль. Оба типа символов.

Интерпретация результатов

Эталонный ноль (zero-true-zero.png) совпал по пропорциям со всеми подозрительно “узкими” буквами.
Это означает: часть дорожных указателей действительно использует 0 вместо О.

Почему так?

Причины могут быть простыми:

  • стопка цифр 0 находится ближе к рабочему месту;

  • цифры используются чаще и под рукой;

  • символы банально путают из-за схожести

Наверняка никакой конспирологии — просто особенности отдельно взятого производства

Возвращение в реальность

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

Как ощущается жизнь когда не переусложнил.
Как ощущается жизнь когда не переусложнил.

Да, взрослым ведь всегда нужно всё объяснять.

P.S.
P.S.

Комментарии (2)


  1. Tzimie
    01.12.2025 15:48

    Уважаемая Балабановская спичечная фабрика! Я уже 11 лет проверяю количество спичек в ваших коробках - их то 59, то 60, то 61, а иногда вообще 58. Вы там все _@@#@ что ли?!