Разработать навигатор для игры? Смотрите! (часть 3.2)

Дороги пришлось вытащить из изображения. OpenCV против красивой карты

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

На словах это звучит как компьютерное зрение. На практике - как спор с картинкой, которая очень не хочет становиться JSON.

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

```python def classify_pixels(base_rgb: np.ndarray) -> np.ndarray: hsv = cv2.cvtColor(base_rgb, cv2.COLOR_RGB2HSV) h, s, v = hsv[..., 0], hsv[..., 1], hsv[..., 2] r, g, b = base_rgb[..., 0], base_rgb[..., 1], base_rgb[..., 2] orange = ( (h >= 2) & (h <= 28) & (s >= 35) & (v >= 70) & (r.astype("int16") - b.astype("int16") >= 35) & (r.astype("int16") >= g.astype("int16") - 12) ) return cv2.dilate( orange.astype("uint8"), np.ones((5, 5), np.uint8), iterations=1 ).astype(bool) ``` Проблема в том, что карта не проектировалась как датасет. Там есть подписи, иконки, швы тайлов, декоративные элементы, разные оттенки дорог. Алгоритм с одинаковой уверенностью мог найти дорогу, подпись на карте и случайный пиксель, которому просто повезло быть нужного цвета.

Полностью автоматом красиво не вышло. Поэтому пришлось сделать не “идеальный распознаватель”, а рабочий процесс: OpenCV находит основу, человек ремонтирует результат.

И это, как ни странно, намного честнее. Автомат делает черновую тяжелую работу. Человек добивает то, что без глаза и здравого смысла не чинится. Если вам интересно посмотреть проект целиком - ссылка на мой GitHub в описании профиля.