Оплата договорная
Описание задачи
Описание задания, скрипт для тестирования, публичные тесты, скрипт для настройки тестового окружения, шаблон решения, дополнительные файлы для решения по ссылке:
https://drive.google.com/file/d/13oY_baZjZHk_ASUP5...Реализация полноценной версии SLAM достаточно трудоемка, поэтому мы сделали для вас несколько искусственное задание, которое, однако, позволит понять, как же работает SLAM. Кроме того, вы можете использовать готовые реализации базовых алгоритмов, чтобы собрать из них ограниченную версию SLAM, которая отлично подходит для учебных целей. На входе задачи имеется набор из N изображений, полученных с одной камеры. Примерно для половины изображений даны координаты центров проекции камер и матрицы поворота. На выходе вам нужно определить положения оставшейся части камер. Кроме того, вам будут даны параметры внутренней калибровки камер.
Давайте определимся с терминами. Камеры, для которых положение известно, мы будем называть опорными, оставшиеся камеры — неизвестными. Чтобы усложнить задачу, мы добавили шум в положения опорных камер, поэтому оно известно только с относительной точностью.
Итак, для решения задачи требуется реализация следующих шагов:
1. Накаждомопорноминеизвестномизображениинайтиположениехарактерныхточек(keypoints) и вычислить для них дескрипторы ORB. Советуем вам сохранить дескрипторы в файлы с помощью pickle, чтобы каждый раз при тестировании не вычислять (для избежания ошибок при сдаче задания советуем вычислять дескрипторы, только если ваш файл с дескрипторами не существует). Количество характерных точек на одном изрбражении должно быть в пределах нескольких сотен.
2. Последовательно для каждой пары опорных камер:
- (a) Выполнить сопоставление характерных точек в пространстве дескрипторов, включая фильтрацию по отношению расстояний между первым и вторым ближайшими дескрипто- рами.
- (b) Отфильтровать неверные соответствия с помощью фундаментальной матрицы и алгоритма RANSAC.
- (c) Запомнить все инлаеры для данной пары изображений.
3. Построить треки точек для всех инлаеров на всех изображениях. Например, у нас есть 3 изображения. На паре изображений 1 и 2 нашлось соответствие между точками с индексами m и n соответственно, кроме того для точки n на изображении 2 еще нашлась соответствующая точка k на изображении 3. В этом случае треком будет считаться последовательность точек m, n и k на соответствующих изображениях. По сути трек — это положение одной и той же трехмерной точки на разных изображениях.
2
- Триангулировать координаты 3д точки для каждого трека. Здесь вам понадобятся положения опорных кадров, которые даны в задании. После этого шага у вас будут вычислены положения 3д точек сцены.
- Каждую трехмерную точку проецировать на все изображения, на которых она видна, и вычислить ошибку репроекции (расстояние между положением дескриптора и репроекцией 3д точки). Если ошибка больше 10 пикселей — исключаем 3д точку (и весь трек) из дальнейшего рассмотрения.
- Для каждого неизвестного изображения:
(a) Провести матчинг дескрипторов относительно опорных кадров (аналогично шагу 2, но только с инлаерами на опорных кадрах). В результаты вы получите соответствия точек на опорных кадрах и текущем неизвестном. Для точек на опорных изображениях мы уже знает трехмерные координаты точек — этого достаточно, чтобы найти искомое положение неизвестных кадров.
7. Сохранить все найденные положения неизвестных камер. Это минимальное решение для всего задания.
Задание нужно реализовать на python с использованием библиотеки OpenCV и OpenCV Contrib.