如果我们知道相机与物体的距离,是否可以获得相机聚焦的物体的真实区域? 例如,我们正在考虑从已知距离拍摄墙的照片。是否可以找到相机捕获的墙壁区域。 这适用于Android应用,因此API中的任何内容都可以帮助我。 我有一个公式,我们必须使用传感器高度,但我研究它不可能找到所有手机的相机传感器大小。
欢迎任何意见。感谢您的帮助。
答案 0 :(得分:1)
我认为可以做到但是:
a)包含手机的平面和包含物体的平面需要平行,也就是说,从相机出来的线必须垂直于要测量的表面;
b)你需要一个额外的校准步骤(在首次启动应用程序时只进行一次设置),例如知道如何在屏幕上显示距离为y米的物体x米长度(必须知道x和y)。例如,知道图像上需要多少像素,对于距离为1米的1米长的物体。请注意,校准过程必须遵守a)。此时它应该是基本几何的问题,因为该区域就像距离的平方,而长度与距离成正比。
示例:
校准:1米外的物体和1米长的物体需要10个像素。所以你知道,在1米处,屏幕上的100个像素形成一个连通的表面,大致相当于1平方米。
问题实例:3米外的物体占据屏幕的150个像素。
解决方案:在2米处,100像素为4平方公尺。在3米处,100像素是9平方公尺。然后在3米处,您的150个像素对应于13.5平方公尺。
请注意,在校准过程中,您可以使用区域而不是长度,但想法是相同的。
另请注意,这仅适用于相机可以被视为投影的原点,我不太确定。如果它不是投影的原点,则需要知道相机/电话平面与理想投影原点之间的距离w(应该是恒定的)。此时,您使用与以前相同的过程,请记住,在进行任何计算之前,您需要添加w。
注3(然后我停止):您可以通过其他方式进行校准,例如知道同一物体在两个不同距离处占据的像素。
答案 1 :(得分:0)
我实际上已经解决了这个问题。 首先,我使用了Camera.Parameters类的getVerticalViewAngle()和getHorizontalViewAngle()方法。我在下面给出的公式中使用它:
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));