Храмы России http://temples.ru/forum/ |
|
Измерения по фотографиям http://temples.ru/forum/viewtopic.php?f=24&t=4605 |
Страница 1 из 5 |
Автор: | Юрий Красильников [ 15 фев 2016, 13:12 ] |
Заголовок сообщения: | Re: Измерения по фотографиям |
2. Как определить фокусное расстояние объектива камеры - алгоритм. Если известна точка съемки, а на фото присутствуют сохранившиеся объекты, то можно определить фокусное расстояние объектива камеры. Разумеется, не его абсолютное значение в мм, а его отношение к размерам снимка (например, к его ширине). Принцип достаточно прост: измеряем (например, по спутниковой карте) угловое расстояние между двумя объектами, а со снимка снимаем координаты соответствующих двух точек. В графических редакторах отсчет координат идет от левого верхнего угла, нам же требуются координаты от геометрического центра снимка. Поэтому пересчитываем эти координаты и делим их на ширину снимка, чтобы они выражались в единицах его ширины. Так, если исходные координаты в пикселях на снимке имели значения xs и ys, то пересчитанные координаты x и y можно найти по формулам x=(xs-0.5*w)/w y=(0.5*h-ys)/w , где w и h - ширина и высота снимка в пикселях. Теперь используем известную формулу из аналитической геометрии для угла между двумя векторами: Cos(A) = (R1,R2)/(|R1|*|R2|) или Cos(A) = (x1*x2+y1*y2+F^2)/(sqrt(x1^2+y1^2+F^2)*sqrt(x2^2+y2^2+F^2)) где x1,y1 и x2,y2 - координаты (пересчитанные относительно центра изображения) двух опорных точек, А - угол между ними, а F - фокусное расстояние. Введем обозначения k=x1*x2+y1*y2 k1=x1^2+y1^2 k2=x2^2+y2^2 С=Cos(A) G=F^2 и упростим уравнение: C = (k+G)/(sqrt(k1+G)*sqrt(k2+G)) или (k1+G)*(k2+G)*C^2 = (k+G)^2 или (1-С^2)*G^2+(2*k-(k1+k2)*C^2)*G+(k^2-C^2*k1*k2) = 0 , т.е. квадрат фокусного расстояния можно найти как положительный корень квадратного уравнения с коэффициентами a=(1-С^2), b=(2*k-(k1+k2)*C^2) и c=(k^2-C^2*k1*k2). Находим корень и, извлекая из найденного числа квадратный корень, определяем фокусное расстояние F. Теперь можно определить угловые поля зрения нашей камеры по горизонтали и вертикали HFOV и VFOV: HFOV=2*arctg(0.5/F) VFOV=2*arctg(0.5*(h/w)/F) w и h - ширина и высота снимка в пикселях. Замечание: предполагается, что снимок не кадрирован (или, по крайней мере, кадрирован симметрично, так что центр изображения остался на месте), а также что дисторсия объектива достаточно мала. Если эти условия не выполнены, метод может дать существенные ошибки. |
Автор: | Юрий Красильников [ 15 фев 2016, 14:12 ] |
Заголовок сообщения: | Re: Измерения по фотографиям |
4. Определение угловых расстояний по фотографии - алгоритм. Если известно фокусное расстояние, то можно легко вычислить угловое расстояние между любыми двумя точками на снимке. Для этого можно воспользоваться уже приведенной формулой: Cos(A) = (R1,R2)/(|R1|*|R2|) или Cos(A) = (x1*x2+y1*y2+F^2)/(sqrt(x1^2+y1^2+F^2)*sqrt(x2^2+y2^2+F^2)) где x1,y1 и x2,y2 - координаты (пересчитанные относительно центра изображения) двух опорных точек, А - угол между ними, а F - фокусное расстояние. Так как Perl не умеет вычислять арккосинус, то можно по значению косинуса найти тангенс нашего угла с помощью известного тождества 1/Cos^2(A)=tg^2(A)+1: tg(A)=sqrt(1/Cos^2(A)-1) и вычислить арктангенс полученного числа. |
Автор: | Юрий Красильников [ 15 фев 2016, 14:36 ] |
Заголовок сообщения: | Re: Измерения по фотографиям |
5. Определение угловых расстояний по фотографии - пример. В качестве примера определим угловое расстояние между центром Троицкого собора и колокольней Знаменского монастыря (у левой границы кадра, точка с координатами (60;450)). Расчетный скрипт: Цитата: # Исходные данные # Ширина и высота снимка $w=1000; $h=917; # Фокусное расстояние $f=1.957083; # Координаты опорных точек 1 и 2 $x1=538; $y1=450; $x2=60; $y2=450; # ------------------------------------- $pi = 3.141592653589; # Печать исходных данных printf "Image size %d x %d\n", $w, $h; printf "F: %f\n", $f; printf "Point 1: %d;%d\n", $x1, $y1; printf "Point 2: %d;%d\n", $x2, $y2; print "------------------------\n\n"; # Пересчет координат и их нормирование $x1=($x1-0.5*$w)/$w; $x2=($x2-0.5*$w)/$w; $y1=(0.5*$h-$y1)/$w; $y2=(0.5*$h-$y2)/$w; # Печать пересчитанных координат printf "Point 1: %f;%f\n", $x1, $y1; printf "Point 2: %f;%f\n", $x2, $y2; print "\n"; # Вычисление и печать косинуса угла $k=$x1*$x2+$y1*$y2+$f*$f; $k1=$x1*$x1+$y1*$y1+$f*$f; $k2=$x2*$x2+$y2*$y2+$f*$f; $ca=$k/(sqrt($k1)*sqrt($k2)); printf "Cos: %f\n", $ca; # Вычисление и печать тангенса угла $t=sqrt(1/($ca*$ca)-1); printf "Tan: %f\n", $t; # Вычисление и печать значения угла $an=atan2($t,1); $ad=180*$an/$pi; printf "Angle: %f deg (%f mrad)\n", $ad, $an*1000; Результат работы: Цитата: Image size 1000 x 917 F: 1.957083 Point 1: 538;450 Point 2: 60;450 ------------------------ Point 1: 0.038000;0.008500 Point 2: -0.440000;0.008500 Cos: 0.971205 Tan: 0.245310 Angle: 13.783033 deg (240.559303 mrad) Таким образом, разность азимутов колокольни Знаменского монастыря и Троицкого собора из точки, откуда был сделан снимок, составляет 13,8 градусов или 240 миллирадиан (тысячных). О полезности тысячных я напишу далее. |
Автор: | Юрий Красильников [ 15 фев 2016, 16:31 ] |
Заголовок сообщения: | Re: Измерения по фотографиям |
6. Тысячные и с чем их едят. Ясно, что линейный размер предмета, его угловой размер и расстояние до него связаны: чем дальше предмет, тем меньше его угловой размер. Если угловой размер предмета достаточно мал, то связь между вышеперечисленными величинами можно выразить приближенной формулой: L=AD , где L - линейный поперечный размер предмета в метрах, А - угловой размер в тысячных (т.е. миллирадианах), D - расстояние до предмета в километрах (тысячах метров). По вышеприведенной формуле можно рассчитать размер предмета, если известно расстояние до него и его угловой размер. Если же известны угловой и линейный размеры, то можно определить расстояние до предмета: D=L/A Формула эта - приближенная, однако для углов менее 240 тысячных (т.е. примерно 14 градусов) ошибка составит менее процента, что более чем достаточно для большинства случаев. Перевод градусов в тысячные и обратно: 1 градус = 17,45 тысячных 1 тысячная = 0,0573 градуса Кстати, в тысячных градуированы угломерные сетки в биноклях: большое деление - 10 тысячных, малое - 5 (соответственно 0,573 и 0,287 градуса). |
Автор: | Юрий Красильников [ 16 фев 2016, 11:07 ] |
Заголовок сообщения: | Re: Измерения по фотографиям |
8. Расчеты в Excel/Calc Так как perl установлен не у всех, описанные выше алгоритмы расчета реализованы в Excel (либо Calc из OpenOffice). Таблица содержит два листа. Первый лист - "Камера", он предназначен для расчета фокусного расстояния камеры и горизонтального и вертикального углов зрения. Входные данные: размеры снимка в пикселях, координаты двух точек на изображении и угол в градусах между направлениями на эти точки из точки съемки. Второй лист - "Углы", он рассчитывает углы между направлениями на заданные пользователем точки. Входные данные: размеры снимка в пикселях, координаты опорного направления (точка 0) и фокусное расстояние камеры, а также таблица координат точек на фото (до 20 точек). Рассчитываются углы между опорным направлением и направлениями на точки из таблицы. Ячейки для ввода данных выделены зеленым, остальные защищены от изменений. Для модификации файла нужно предварительно снять защиту листа. Расчетный файл - в приложении к данному сообщению. PS К сожалению, приложить к сообщению файл .xls нельзя (запрещено администратором). Надеюсь, проблему можно как-то решить. |
Автор: | Юрий Красильников [ 18 фев 2016, 16:23 ] |
Заголовок сообщения: | Re: Измерения по фотографиям |
DMITRY писал(а): Подъезд к ж.д. мосту через р. Лососинку около ст. Петрозаводск [Олонецкой] ж.д. Возможно ли определить расстояние до моста? Дрезина и мост сбоку крупным планом: Примерно можно. Предположим, что фокусное расстояние - 1,95 (в единицах длинной стороны кадра). Таким объективом Прокудин-Горский снимал в Осташкове. Открываем полноразмерный снимок: http://prokudin-gorskiy.ru/library/recovery/0240_914o.jpg Слева на мосту стоят три человека. Координаты макушки правого - (902;900), а подошв - (902;1060). Вбиваем в мой экселевский файл фокусное расстояние, размер снимка (3342х2950), одну из точек берем как опорную, а другую - первой в список. Скриншот - в приложении. Вложение:
Комментарий к файлу: Скриншот расчета calc.png [ 94.36 KiB | Просмотров: 12705 ] Угол - 24,2 тысячных. Рост человека примем за 1,75 м (средний). Расстояние D=H/A=1,75/24,2=0,072 км = 72 м. Расстояние до группы людей на заднем плане - вдвое больше, т.е. примерно 150 м (точки (2450;1314) и (2450;1394), угол 12.2 тысячных. Если угол практически точно вдвое меньше, то расстояние - вдвое больше. Координаты (широту и долготу) этого мостика не дадите? Что-то не нашел в Google Earth с ходу. По спутниковому снимку, может быть, возможно более-менее определить точку съемки. |
Автор: | DMITRY [ 18 фев 2016, 16:42 ] | ||
Заголовок сообщения: | Re: Измерения по фотографиям | ||
Координаты моста: http://wikimapia.org/#lang=en&lat=61.772575&lon=34.346631&z=16&m=b&search=%D0%B1%D0%B5%D0%BB%D0%BE%D0%BC%D0%BE%D1%80%D1%81%D0%BA
|
Автор: | DMITRY [ 18 фев 2016, 16:57 ] |
Заголовок сообщения: | Re: Измерения по фотографиям |
"Расстояние D=H/A=1,75/24,2=0,072 км = 72 м." По-моему, 72 метра - это мало. Если брать наимен. длину рельса (10,6 м) http://temples.ru/forum/viewtopic.php?p=12599#p12599 , то примерно 14 рельсов до моста, и получится около 140 метров. И расстояние до дальней группы не выглядит в 2 раза больше, чем до моста. |
Автор: | Юрий Красильников [ 18 фев 2016, 17:03 ] |
Заголовок сообщения: | Re: Измерения по фотографиям |
DMITRY писал(а): Координаты моста: Ага, нашел. Ну, вряд ли получится: дорога теперь двухколейная, мосты выстроили заново. Но, наверно, если будем считать, что съемка велась метров за 70-80 от ближней опоры - не очень ошибемся. Жаль, что экселевский расчетный файл нельзя выложить... Может, администраторы помогут? |
Автор: | Юрий Красильников [ 18 фев 2016, 17:22 ] |
Заголовок сообщения: | Re: Измерения по фотографиям |
DMITRY писал(а): По-моему, 72 метра - это мало. Если брать наимен. длину рельса (10,6 м) http://temples.ru/forum/viewtopic.php?p=12599#p12599 , то примерно 14 рельсов до моста, и получится около 140 метров. И расстояние до дальней группы не выглядит в 2 раза больше, чем до моста. Прошу прощения, я неправильно понял. 72 метра - это для фото с видом моста сбоку, расстояние от фотографа до ближайшей опоры (трех людей на мосту, точнее). Пересчитаем. Полагаю, метров 200. Там слева человек стоит, его угловая высота у меня получилась в 8,5 тысячных. Ну, это примерно, т.к. его ног не видно, брал по основанию рельса, за которым он стоит. Да и рост 1,75 м - плюс-минус, конечно. Расчет - в приложении, снимок http://www.veinik.by/foto/0201-0300/0239l.jpg кропнут по изображению, иначе пришлось бы пересчитывать фокусное расстояние (оно посчитано для снимка без полей). Вложение:
Комментарий к файлу: Расчет
calc.png [ 66.73 KiB | Просмотров: 12699 ] |
Автор: | DMITRY [ 18 фев 2016, 18:47 ] | ||
Заголовок сообщения: | Re: Измерения по фотографиям | ||
![]() Юрий, спасибо за расчет! Ниже наиболее близкое по расстоянию сравнение, немногим более 200 метров (перед мостом пикетный столбик №9). http://prokudin-gorskiy.ru/group.php?ImageID=888
|
Страница 1 из 5 | Часовой пояс: UTC + 3 часа |
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group http://www.phpbb.com/ |