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

В моменты монотонного движения я развлекался простой игрой: составлял слова (часто непечатные), убирая одну-две буквы с дорожных указателей. Иногда получалось забавно — настолько, что я останавливался, чтобы сфотографировать результат, прикрыв часть знака пальцем. Но со временем взгляд начал цепляться совсем за другое.
Некоторые буквы О выглядели… не как буквы.
Аномалия
На ряде указателей О была слишком узкой, вытянутой, «неживой». Казалось, она выбивается из общего стиля. При этом на соседних указателях всё выглядело нормально.

Большинство людей, которым я показывал эту аномалию, не видели ничего необычного. Но ощущение оставалось: где-то здесь есть закономерность.
Постепенно появилась гипотеза: на некоторых указателях вместо буквы О используется цифра 0.
Звучит почти как теория заговора, но проверяется вполне технически.
Чем отличаются О и 0
В большинстве шрифтов символы отрисованы со следующими отличиями:
буква О шире, имеет более округлую форму;
цифра 0 уже и вытянутее;
в моноширинных шрифтах различие создают дополнительные точки, штрихи или особая форма контура.

Как видим, есть разные причины, по которым глаз может воспринимать символы как О или 0, но в основном это пропорции высоты и ширины.
Не очень хотелось для каждого измерения или проверки гипотезы ездить и мерить знаки. А воровать их на время исследования в мои планы не входило. Поэтому, вместо простого измерения указателей рулеткой, будем их фотографировать, чтобы иметь возможность комфортно их измерить — ну и иметь пруфы, конечно.
Но чтобы сравнить символы корректно, нужно получить их изображение без искажений.
Получение изображений знаков
Определяем направление
Обычное фото даёт сильные перспективные искажения, зависящие от угла, расстояния.
Если мы хотим измерять высоту и ширину символов, фотографии нужно нормализовать. То есть получить изображение, соответствующее реальной плоскости и размерам знака, чтобы исключить расхождение относительных размеров на фото и в реальности.
Для этого нужна простая система калибровки — набор опорных точек, расположенных заранее известным образом.
Проверка метода трансформации
Чтобы проверить, можно ли корректно исправлять перспективу, я собрал тестовый "знак". Взял деревянную раму для стабильности плоскости и закрепленный на нее картон с сеткой известного размера.

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



Матрица для работы в поле
На этом этапе я понял: нужно сделать устройство, которое можно быстро приложить к любому дорожному знаку, сфотографировать и поехать дальше.
Так появилась деревянная рама с ArUco-маркерами и магнитами — матрица, которую можно буквально “пристегнуть” к металлическому знаку.


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

Матрица хорошо работала, за исключением единственного перекрученного знака, к которому магниты не липли. Пришлось использовать человеческие подпорные руки.
Обработка изображений
Опорные точки задают прямоугольник 1200×500 мм.
Алгоритм обработки каждого кадра был следующим:
распознать маркеры на фото;
трансформировать изображение в плоскость по маркерам;
вырезать участок с символом
О/0(пришлось сделать руками);очистить шум и бинаризовать;
повернуть символ горизонтально (используя минимальный описывающий прямоугольник).

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

Измерения
Далее — автоматическое измерение ширины, высоты и вычисление их отношения.
Результат:
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находится ближе к рабочему месту;цифры используются чаще и под рукой;
символы банально путают из-за схожести
Наверняка никакой конспирологии — просто особенности отдельно взятого производства
Возвращение в реальность
Поток мыслей и ненужных усложнений отступают. Приходит осознание того, что иногда стоит просто взять рулетку, чтобы убедиться шляпа это или удав, проглотивший слона.

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

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