这是一个普通的数学问题,我希望有人可以帮助我。我的应用程序让用户拍摄屋顶的照片,然后标记屋顶的周长。我想计算用户绘制的梯形区域。然而,由于屋顶是倾斜的,我需要根据这个事实进行调整。
有人能指出我正确的方向吗?我的数学技能非常生疏(并且从未特别强大)。
- 照片可能有所帮助。用户可以使用红线勾画出如下所示的屋顶。但是如果屋顶可以神奇地旋转到与地面垂直,那么它看起来可能会填充更接近蓝线的空间。所以,我想知道的是,有什么数学可以做到这一点吗? (我意识到还有其他选择,例如使用单独的图片计算双面的长度并将它们相乘。)
答案 0 :(得分:3)
从单纯的图片中获取实际屋顶的区域是不可能的。你不知道这张照片是在5米还是50米处拍摄的,所以在图片中看起来很小的屋顶可能是巨大的。你需要一张深度图来获得屋顶的实际尺寸,即使这样也很棘手。
答案 1 :(得分:2)
这是可能的,但前提是你可以在拍摄照片的情况下添加一系列约束:
如果您知道相机的水平开启角度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
。
请注意,这种近似就是这样。近似值。尝试一些你知道该区域的屋顶的例子,以了解准确性(我担心这可能会非常糟糕)。