Задать вопрос
  • Как склеить 2 и более изображения с помощью поиска локальных особенностей?

    Vindicar
    @Vindicar
    RTFM!
    Можно сделать так:
    1. Вычисляешь матрицу преобразования, которому нужно подвергнуть изображение 2, чтобы склеить его с изображением 1 (далее, 2->1).
    2. Вычисляешь матрицу преобразования 3->2.
    3. Склеиваешь 3 с 2, используя матрицу 3->2.
    4. Склеиваешь сумму 3 и 2 с 1, используя матрицу 2->1.
    Альтернативно, ты можешь подвергнуть 3 преобразованию 3->2, а потом 2->1 (либо последовательно, либо перемножив их матрицы), чтобы перевести его в систему отсчёта изображения 1, и склеить их непосредственно.

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

    Ещё я не вполне понял, что ты имеешь ввиду под "панорамное изображение".
    Но я подозреваю, это может быть вызвано тем, что на выбранном корневом (первом) изображении ракурс отличается от "нормального" - строго перпендикулярного целевой плоскости. Тогда тебе нужно выбрать такое изображение, на котором ты можешь более-менее точно определить целевую плоскость. ТУт может помочь какой-нибудь маркер типо QR-кода, aruco-маркера, да хоть банальный шахматный шаблон (с ним, кстати, проще всего). Главное, чтобы его размер был известен, и он был прямоугольный. Тогда можно будет рассчитать преобразование для этого изображения, которое исправит перспективу. Мы будем "смотреть прямо" на плоскость, где расположен этот шаблон. Это исправленное изображение и будет для нас корневым, к которому мы будем "пристёгивать" остальные.
    Ответ написан
    Комментировать
  • Питон,нейросеть, алгоритм выхода из лабиринта?

    Vindicar
    @Vindicar
    RTFM!
    Общая идея задачи. как я её понял: дрон с воздуха снимает лабиринт, затем алгоритм сшивает кадры в одно изображение, извлекает форму лабиринта и строит путь по нему. Так? Если так, это должно было быть в вопросе.

    У тебя три чётко видимых шага.
    1. Сборка карты лабиринта по видео с дрона. Я бы для начала использовал поиск локальных особенностей (SIFT, углы по Харрису, или что-то столь же простое).
    Вопрос 1
    Что использовать - сильно зависит от условий съёмки. Чем более контрастные элементы присутствуют на изображении, тем лучше.

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

    По итогам сравнения мы получим проективное преобразование, описывающее, как надо повернуть/наклонить/растянуть/etc один кадр, чтобы совпали общие с соседним кадром части. Подвергнув кадр такому преобразованию, мы сможем все кадры привести к одной плоскости.
    Вопрос 3
    Скорее всего, возможные преобразования будут на нескольких кадрах, так что придётся их как-то ранжировать, и "усреднять" несколько наилучших преобразований с ближайшими соседями

    Тогда постепенно построите одно изображение-карту, а уж дальше его можно будет обрабатывать обычными средствами. Там, пороговое преобразование или что для выделения "стен", определение границ лабиринта, и дальше уже тупой flood-fill для поиска пути.
    Ответ написан
    1 комментарий
  • Питон,нейросеть, алгоритм выхода из лабиринта?

    mayton2019
    @mayton2019
    Bigdata Engineer
    Автор ищет функцию следующего вида.
    def (pointA : point, pointB : point, figures : list) -> list

    На вход приходит например точка А. Это где мы стоим. И точка Б - это выход из лабиринта.
    Это впрочем мое видение задачи. Можно и изменить. И список фигур (полигоны) третьим
    аргументом. И результат - список координат - траектория движения. Как выбежать из лабиринта.
    Если решения не существует (например мы огородили точку А кольцом камней) то функция
    должна вернуть например None.

    В классическом варианте движение из точки А в точку Б в лабиринте реализуется на клеточном
    поле алгоримом Волны или Волновым алгоримом.
    https://habr.com/en/search/?target_type=posts&orde...]

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

    По поводу нейросетей. Тема модная и не сходит с топ обсуждений.

    Я предлагаю вместо нейросетевого решения обсудить кейсы когда решения не существует
    а НС об этом не знает или не умеет такое детектировать. Если мы будем подмахивать нейросети
    и подсовывать ей заведомо легкие решение (нет сплошной стены из фигур вокруг точки А например).
    то это решение будет туфтой. И также туфтой будет нейросеть сколь бы умно она не выглядела.

    Почему я решил пойти от негативного кейса? Мне кажется это - вопрос интересный и дискуссионный.
    Это как доказательство теоремы. В случае алгоритма волны - это возможно. Если волна заполнила
    все пространство вокруг А и не достигла Б - значит решения нет.

    Кроме нейросетей есть еще комбинирование рандомных решений с улучшениями (генетические
    алгоритмы)
    . С точки зрения лабиртнта это выглядит как построение большого количества
    случайных путей из точки А в точку Б с отбором тех путей которые
    - которые короче другие
    - которые не пересекают края фигур

    Для генетики признаком невозможности найти решение будет скорее всего количество эпох
    после которых мы так и не получили маршрут от А до Б без наезда на зеленые фигурки.
    Ответ написан
    Комментировать