我想找到使用相机获取对象尺寸的解决方案,这听起来像是重复一个
How to measure height, width and distance of object using camera?
但解决方案并没有帮助我。从上面的链接中我有一个想法找出距离(Measure Distance)。
有人可以建议我如何获得物体的宽度和高度。简单的数学或任何想法都会非常有用。
是否有可能使用OpenCV实现上述解决方案。 Measure Height and Width
到目前为止我尝试了什么:
假设我们假设固定距离,我们可以计算Angle of elevation
tan(α/2) = (l/2)/d,
hence
α = 2*atan(l/2d)
但我们仍然不知道L(对象的长度)的值
查找视角的另一种方法:
double thetaV = Math.toRadians(camera.getParameters().getVerticalViewAngle());
double thetaH = Math.toRadians(camera.getParameters().getHorizontalViewAngle());
似乎不起作用!!
答案 0 :(得分:4)
例如this website of Georgia State University上解释了镜头的实际物理特性。
请参阅此图解说明如何使用线性放大率或焦距关系从图像大小中找出对象大小:
特别是-i / h' = o / h
,此关系o / h
适用于所有类似的三角形(即距离2h
的大小为2o
的对象具有相同的大小图片上h'
)。因此,正如您所看到的,即使在完整等式的情况下,您也无法知道对象的距离o
和大小h
- 但是一个会给你另一个。< / p>
另一方面,两个距离相同的物体o
会看到图像上的尺寸h1'
和h2'
与现实生活中的尺寸成正比h1
和h2
,h1' / h1 = M = h2' / h2
。
因此,如果你知道一个对象o
和h
,你知道M
,因此知道对象在胶片上的大小,你可以从它的距离中减去它的大小,反之亦然。
-i / h'
值自然表示为最大h'
。如果对象的大小完全填充图像,则填充视野,然后其距离与其大小的比率为tan(α/2) = (l / 2) / d
(请注意,在下图的约定中,d = o
和l = 2 * h
)。
这个α就是你的例子中你的名字。现在,从图像大小,您可以在您看到图像的角度下获得 - 也就是说,如果距离为l
,图像的大小为d
。从那里,你可以从它的距离推断出对象的大小,反之亦然。
算法步骤:
r = size of object in image (in px) / total size of image (in px)
当然,沿着您知道或计划获得真实物体大小的轴执行此操作。r *= tan(camera.getParameters().getXXXXViewAngle() / 2)
r
现在是您看到对象的半角的正切,因此以下关系为真:r = (l / 2) / d = h / o
(带有相应图形的符号)。d
,则其大小为l = 2 * r * d
l
,那么距离为d = l / (2 * r)
这适用于相机实际指向的物品,如果它们不居中,则数学可能会关闭。