0

如果我们知道相机与物体的距离,是否可以获得相机聚焦的物体的真实区域?例如,假设我们正在从已知距离拍摄墙壁照片。是否可以找到相机捕获的墙壁区域。这是针对 Android 应用程序的,所以 API 中有什么可以帮助我的吗?我有一个公式,我们必须使用传感器高度,但是当我研究它时,不可能找到所有手机的相机传感器尺寸。

欢迎任何意见。我在这里先向您的帮助表示感谢。

4

2 回答 2

1

我认为可以做到,但是:

a) 包含手机的平面和包含您的物体的平面需要平行,即从相机出来的线必须垂直于要测量的表面;

b) 您需要一个额外的校准步骤(在第一次启动应用程序时只完成一次设置),例如,知道 x 米长的物体在 y 米的距离处如何出现在您的屏幕上(x 和 y 必须知道)。例如,知道距离 1 米的 1 米长的物体在图像上需要多少像素。请注意,校准过程必须遵守 a)。

在这一点上,它应该是基本几何的问题,因为面积就像距离的平方,而长度与距离成正比。

例子:

  • 校准:1 米外、1 米长的物体需要 10 个像素。所以你知道在 1 米处,屏幕上的 100 个像素形成一个连接的表面,大致对应于 1 平方米。

  • 问题实例:3米外的物体占用屏幕150个像素。

  • 解决方案:在 2 米处,100 个像素为 4 m^2。在 3 米处,100 个像素为 9 m^2。然后在 3 米处,您的 150 像素对应于 13.5 m^2。

请注意,在校准过程中,您可以使用面积而不是长度,但想法是相同的。

另请注意,这仅在相机可以被视为投影的原点时才有效,我不太确定。如果它不是投影的原点,则您需要知道相机/手机平面与理想投影原点(应该是常数)之间的距离 w。此时,您使用与之前相同的过程,请记住,在进行任何计算之前,您必须在每个距离上加上 w。

注3(然后我停止):您可以通过其他方式进行校准,例如了解同一物体在两个不同距离处占据的像素。

于 2013-07-19T08:54:48.120 回答
0

我实际上解决了这个问题。首先,我使用了 Camera.Parameters 类的 getVerticalViewAngle() 和 getHorizo​​ntalViewAngle() 方法。我在下面给出的公式中使用了它:

tan(θ/2) = x/2z 其中 θ 是我从上述方法中得到的角度,x 是对象的高度/宽度(取决于我使用的两种方法中的哪一种),z 是距离从相机的对象。

如果您正确测量了距离以及您握住相机的角度,则结果非常准确(它必须按照@type-alpha 的建议理想地平行)。

Camera.Parameters cp = camera.getParameters();
    double distance = Double.parseDouble(editText.getText().toString());
    /*double height = distance * 2.57/cp.getFocalLength();
    double width = distance * 3.42/cp.getFocalLength();*/
    double realheight = 2 * distance * Math.tan(Math.toRadians(cp.getVerticalViewAngle() / 2));
    double realwidth = 2 * distance * Math.tan(Math.toRadians(cp.getHorizontalViewAngle() / 2));
于 2013-07-20T11:31:21.073 回答