#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))
.
Входные данные: неискаженное изображение, угол поворота и наклона, поле обзора камеры, желаемые углы рентабельности инвестиций