Этот пост написан для целей последующего цитирования.
Часто приходится видеть, как кто-нибудь, просто глядя на фотографию, делает смелые и при этом грубо неверные суждения о расстояниях и углах между запечатленными объектами, считая свое утверждение доказанным, как только он как-нибудь обозвал всех, кому то же самое не очевидно. Между тем, такие суждения, будь они верными, как правило могут быть подтверждены одним из следующих способов:
1) сделать модель объектов, изображенных на фотографии, и сфотографировать их так, чтобы получилось похоже на обсуждаемый снимок;
2) провести соответствующие геометрические построения.
С первым способом все понятно - это проблема того, кто делает смелые заявления, как слепить модель. Данный пост посвящен второму способу - построениям. Я опишу некоторые закономерности, которые с успехом могут быть использованы для измерений.
Разумеется, для проведения измерений по фотографии к последней предъявляются определенные требования. Для большей точности, понятное дело, нужно, чтобы фотография была резкой и имела высокое разрешение. Для описанных здесь методов еще важно, чтобы прямые линии на фотографии оставались прямыми. Для фотографий, сделанных большинством бытовых фотоаппаратов это условие как правило выполняется (подозреваю, что цифровые фотоаппараты просто выправляют изображение, но не уверен). При широкоугольной съемке как правило присутствует бочкообразная дисторсия, которая делает описанные ниже приемы бесполезными. Еще важно, чтобы были сохранены пропорции самой фотографии. Если снимок сжат или растянут по одному направлению, со многими приемами возникнут проблемы. И наконец, предполагается известным, где находится центр снимка. Если кто-то несимметрично срезал края фотографии, тоже возникнут трудности.
Итак, приступаем. Если к плоскости фотографии восстановить перпендикуляр из центра снимка (этот центр будет обозначаться через O на рисунках), то на этом перпендикуляре есть точка, из которой мы видим все объекты под теми же углами, под которыми их видел фотограф. Переместимся мысленно в эту точку и нарисуем на плоскости снимка окружность, радиус которой равен расстоянию от нас до снимка, и центром в центре снимка. Не знаю, называется ли как-нибудь научно эта окружность, поэтому назову ее по-своему - главной, так как она очень пригодится в дальнейших построениях. На рисунках она будет красной. Для большинства снимков она оказывается полностью вне фотографии, но при небольших зумах может частично или полностью оказаться внутри.
Кстати зумом фотографии я буду называть отношение диаметра главной окружности к ширине снимка. Обычно это величина, большая единицы. На яндекс-панорамах 1 - минимальное значение зума. При зуме, равном единице, угловой размер снимка по ширине равен 90˚. Вот пример такой фотографии:
С каждой точкой на фотографии ассоциируется луч, идущий от фотографа к соответствующему объекту. Для двух точек, стало быть, имеет смысл говорить об угле между соответствующими лучами. Этот угол я буду называть просто углом между точками. Следующий рисунок показывает, как узнать этот угол, если на плоскость рисунка нанесена главная окружность. Данные точки обозначены через A и B, угол ∠AFB искомый.
Чем больше радиус главной окружности, тем угол получится меньше. Поэтому, если между какими-то двумя точками на снимке угол известен (и известен центр снимка), мы можем построить главную окружность, а затем измерять уже все остальные углы.
Где взять пару точек с известным углом между ними? Один вариант - в кадре оказались далекие объекты, которые можно найти на карте, и при этом место съемки известно с точностью, не существенно влияющей на угол между объектами. Для иллюстрации: если в кадре оказались две опознаваемые звезды, точка съемки вообще не играет роли - со всех точек земной поверхности угол получится практически одинаковый. Но до сих пор звезды на фотографиях, требующих анализа, мне пока не попадались. Далекие здания, особенности рельефа или ландшафта - более типичные ориентиры.
Другой вариант - в кадре оказался плоский предмет правильной формы, с удачного ракурса. Например, любой прямоугольник, заснятый так, что обе пары его противоположных сторон на снимке стали далеки от параллельных. Тогда угол между точками пересечения продолжений противоположных сторон прямой, и мы можем построить главную окружность (ее центр O нам должен быть известен заранее!):
Если направления противоположных сторон хотя бы в одной паре оказались близки к параллельным, с точностью построения будет беда. Так что прямоугольник прямоугольнику рознь. Хорошо иметь не просто прямоугольник, а квадрат. Тогда можно еще использовать направления диагоналей и существенно повысить точночть.
Линия горизонта. Она есть у каждой плоскости, попавшей в кадр, если эта плоскость не перпендикулярна оси объектива. Параллельные линии в этой плоскости на фотографии пересекутся на соответствующей линии горизонта. У параллельных плоскостей линии горизонта совпадают. Если требуется измерить угол между прямыми на плоскости, для которой на фото известна линия горизонта, нужно провести эти прямые до пересечения с горизонтом и измерить угол между точками пересечения по указанной выше схеме. Аналогично, если известны линия горизонта для данной плоскости и главная окружность, на снимок можно нанести образ любого построения на этой плоскости, выполненного циркулем, линейкой и транспортиром.
Пример для иллюстрации: пусть мы знаем главную окружность и линию горизонта (зеленая на рисунках ниже) некоторой плоскости. Построим образ квадратной сетки в этой плоскости. Для начала на линии горизонта отметим три точки с углом 45˚ между соседними:
Теперь стираем лишние построения и, начиная с произвольной точки, рисуем сеточку:
Прямоугольники в кадре хороши не только тем, что позволяют (при удачном ракурсе) сделать "угловую калибровку" снимка - т.е. найти главную окружность. Одновременно с этим они определяют линию горизонта для своей плоскости. Таким образом, в той же плоскости мы теоретически можем теперь измерять все подряд. На практике, конечно, возможности этих методов сильно ограничены разрешением фотографии. Кроме того, объекты, предполагаемые плоскими, на практике таковыми не являются. С ошибками, которые могут из-за этого возникать, следует быть особенно осторожным.
Еще несколько полезных замечаний. Для каждой точки X на снимке все точки Y для которых угол между X и Y прямой, образуют прямую линию. Ее я буду называть полярой точки X, а точка X для этой прямой будет полюсом. Вот как они связаны (оба зелененькие):
Тот, кто и раньше знал, кто такие полюс и поляра, заметит, что в данном случае идет речь о полюсах и полярах НЕ относительно главной окружности.
Какой толк от этих объектов? К примеру, с помощью описанных выше приемов мы нанесли образ квадратной сетки на площадке, на которой стоял фотограф, и продолжили сетку за пределы снимка. Находим полюс линии горизонта для соответствующей плоскости и узнаем, в какой клетке стоял фотограф. Еще одно применение - измерение угла между плоскостями. Он равен углу между полюсами линий горизонта этих плоскостей на снимке, который мы измерять уже научились.
Наконец, кое-что можно измерить и без главной окружности. А именно, находить пропорции вдоль прямой, если на этой прямой известна точка горизонта. Например, у вас есть две линии, которые в реальности параллельны, а на снимке пересеклись (рельсы, линии разметки, и т.п.). Точка пересечения - их горизонт. Обозначим ее через M. Пусть на той же прямой даны три точки A, B, C. Сравнивать расстояния |AB| и |AC| на снимке бессмысленно, оно не будет таким, как в реальности. Но вот двойное отношение (|AB|/|AC|)/(|BM|/|CM|) будет равно тому, чему в реальности равнялось отношение |AB|/|AC|.
Может, дополню потом этот пост еще примерами и уточнениями, а пока завязываю.
update 16/02/2013
a_kruglov посоветовал хорошую программу для исправления искажений и проективных преобразований - hugin. Надо взять на вооружение.