Гомография: ошибка репроекции и inliers на Python

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

Программа курса «Computer Vision Engineer: от детекции и Doc-AI до продакшна».

Кто согласен с матрицей

Задание

Реализуйте функцию count_inliers(matrix, source, target, threshold). Она получает гомографию, точки первого кадра, сопоставленные им точки второго и допуск в пикселях, а возвращает разметку пар и долю согласных с матрицей — то самое, что findHomography отдаёт вторым значением.

Точка переводится матрицей так:

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

Если оказался равен ровно нулю, переводить точку некуда — такая пара согласной не считается.

Ответ — кортеж из двух значений: список нулей и единиц по каждой паре в том же порядке, что и на входе, и доля единиц в нём. На пустом входе вернуть пустой список и 0.0.

Пример

matrix = [[1.0, 0.0, 10.0], [0.0, 1.0, -5.0], [0.0, 0.0, 1.0]]
source = [(0.0, 0.0), (100.0, 50.0), (20.0, 20.0)]
target = [(10.0, -5.0), (112.0, 45.0), (60.0, 20.0)]
count_inliers(matrix, source, target, 3.0)
# ([1, 1, 0], 0.6666666666666666)

Матрица здесь — чистый сдвиг на 10 вправо и на 5 вверх. Первая пара легла точно, вторая разошлась на два пикселя и в допуск уложилась, третья промахнулась на тридцать.

Примечание

Вход уже разобран и приходит аргументами: матрица — список из трёх списков по три числа, точки — списки пар чисел одинаковой длины, допуск — число с плавающей точкой. Менять входные списки нельзя.

Модуль math нужно импортировать самостоятельно. Вызывать функцию вручную не нужно, проверка запускает её сама.

Что проверяется

Код проверок скрыт, так что вот полный список того, что в них разбирается:

  • формат ответа: кортеж из списка нулей и единиц длиной со вход и доли от нуля до единицы;
  • входные списки после вызова не изменились;
  • пример из условия;
  • переведённая точка совпала со своей парой;
  • промах ровно на допуске и промах чуть больше допуска;
  • матрица с ненулевой перспективой, где делить на w обязательно;
  • w, обращающийся в ноль на одной из точек;
  • ни одна пара не уложилась в допуск;
  • одна пара во всём входе;
  • пустой вход.
РешениеPython

Без регистрации. Гостевая проверка не сохраняет прогресс. Для сохранения перейдите к уроку.

Отправьте решение, чтобы увидеть результаты тестов.

Связанные задачи