Это возможно, но только в том случае, если вы можете добавить множество ограничений к ситуации, когда делается снимок:
- Если вам известен угол открытия объектива, использованного для съемки, и вы знаете точное расстояние до крыши во время съемки (расстояние между камерой и водосточным желобом), и изображение было сделано точно так же, как в Ваш образец с крышей, перпендикулярной оси камеры, а камера направлена прямо в горизонтальный центр желоба, и вы наверняка знаете, что крыша прямоугольная, тогда она удивительно проста. Если вы не возражаете против 10-25%. (в зависимости от точности различных измерений).
- Если вы не можете знать угол открытия объектива (потому что снимок сделан не камерой, которой вы управляете, или потому, что снимок сделан камерой с зум-объективом), но есть объект известного размера На известном расстоянии от камеры на изображении оно все равно удивительно просто, поскольку можно определить угол раскрытия от известного объекта. Объект должен быть значительно большим на изображении (50% горизонтальной ширины на изображении или около того), но он может быть ближе к фотографу, поэтому он не должен быть таким же большим, как крыша.
- Если вы не можете контролировать точное положение, из которого был сделан снимок (то есть он не будет сделан прямо напротив центра желоба), ваша точность будет слишком низкой.
Если вам известен горизонтальный угол раскрытия alpha
камеры, расстояние Dgut
между камерой и желобом, ширина желоба в пикселях Wgut
и ширина изображения в пикселях Wim
, то Вы можете определить приблизительную длину желоба Lgut
из:
Dpixgut= Wim/(tan(alpha/2)) # distance to the gutter in pixel space
tan(anggut) = Wgut/Dpixgut # tan of half "opening angle" of the gutter
Lgut= 2*tan(anggut)*Dgut
Поскольку вы знаете, что Ltop
(длина вершины крыши) равна Lgut
(это одно из ограничений), вы можете использовать ширину вершины в пикселях Wtop
, чтобы вычислить расстояние до верх крыши Dtop
:
Dpixtop=Wim/(tan(alpha/2)) #dist to top in pixel space
tan(angtop)=Wtop/Dpixtop
Dtop=Ltop/(2*tan(angtop)) #dist to roof in real space (note that Ltop=Lgut)
Dtop-Dgut
дает приблизительную оценку длины Lroof
крыши, поэтому Dgut*Lroof
является приблизительным приближением к площади. Чтобы быть более точным, вы должны включить некоторые расчеты, аналогичные приведенным выше, чтобы определить высоту желоба и верхнюю часть крыши над осью камеры, а затем отрегулируйте Lroof
для этого.
Обратите внимание, что это приближение именно так. Приближение. Попробуйте примеры с крыш, для которых вы знаете область, чтобы почувствовать точность (которая может быть на удивление плохой, боюсь).