Вычисление вида с высоты птичьего полета с помощью OpenCV

#python #matlab #opencv #computer-vision #homography

#python #matlab #opencv #компьютерное зрение #гомография

Вопрос:

В поисках простого способа вычисления вида с высоты птичьего полета я обнаружил этот метод в Matlab. Это кажется довольно практичным подходом к проблеме ручного аннотирования точек источника и назначения. В общем, я хотел бы понять, существует ли математический подход к вычислению точек источника и назначения только из физических свойств камеры. Я был бы очень признателен за любой код, который использует те же входные данные, что и пример Matlab, но основан на OpenCV.

Я знаю, что stackoverflow — это не сообщество «go write my code», поэтому даже полезная подсказка или любая математика будут оценены.

Комментарии:

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

2. @Burak Суть этого вопроса заключалась в том, чтобы избежать этой процедуры. Но спасибо за ресурс.

Ответ №1:

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

Угол отклонения не важен для нашего случая. Если вы повернете изображение на величину крена (вокруг центрального пикселя), то вы сможете найти 4 желаемые точки, используя величину шага. Чтобы найти эти нужные точки, нам нужно знать значения поля зрения камеры по горизонтали и вертикали.

Что это за 4 точки? Они образуют прямоугольник, если смотреть сверху в реальном мире. Ширина прямоугольника — это выбор дизайна. Например, ближние точки могут быть направлены на 45 градусов вниз (между линией горизонта) с общей шириной 60 градусов, а дальние могут быть направлены на 10 градусов вниз с некоторым определенным углом ширины. Нам нужно вычислить этот угол один раз.

Пусть h — высота камеры, x расстояние между точкой проекции камеры на плоскость прямоугольника и дальним краем прямоугольника (параллельно линии горизонта) и y быть половиной расстояния от ширины прямоугольника. Учитывая приведенные выше примеры углов, x=h*cot(10) и y=h*csc(45)*tan(60/2) . Угол ширины становится 2*atan2(y, x^2 h^2) = 2*atan2(csc(45)*tan(60/2), cot(10)^2 1) .

Если камера имеет, например, поле зрения 70 градусов, то точки по краям находятся на расстоянии 35 градусов от центра. Но пиксель, который находится между центром и одним краем, не находится на расстоянии 35/2 градуса от центра. Так и должно быть atan(tan(35)/2) .

Как только вы найдете нужные 4 точки, вы можете использовать findHomography warpPerspective функции и, где соотношение ширины и высоты dst_pts должно быть лучше 2*y/(x-h*cot(45)) = 2*csc(45)*tan(30)/(cot(10)-cot(45)) .


Входные данные: неискаженное изображение, угол поворота и наклона, поле обзора камеры, желаемые углы рентабельности инвестиций


Углы