通过摄像机角度失真从屏幕高度查找图像的实际高度

时间:2016-11-21 13:02:27

标签: matlab image-processing geometry computer-vision vision

如果我的手机摄像头在我的手机上处于已知高度并且从已知距离拍摄照片,我怎样才能找到照片底部物体的实际高度,考虑到相机拍摄的是顶角的照片? This question谈到了类似的问题,但答案没有考虑相机的角度和高度。 这是设置图 - Phone photographing yellow object at the bottom

h是蓝色屏幕前方黄色框的实际高度。 这是相机拍摄的图像 -

Image captured by camera

如何在图像上找到h,给定h'?假设相机的焦距已知。

2 个答案:

答案 0 :(得分:2)

enter image description here

假设您知道校准矩阵 K ,这里的解决方案比计算角度更简单。选择点 p1 =(x,y) p2 =(r,s),如上图所示。由于您说您知道从相机到物体的距离,这意味着您知道相机坐标中这些点的深度 d ,并且

Q1=inverse(K)*p1*d
Q2=inverse(K)*p2*d

在相机坐标中给出立方体上的相应点。现在你寻求的高度就是

abs(Q1-Q2)

希望有所帮助。

编辑:以下是有关校准矩阵的快速说明。使用pinhole camera model时,可以通过乘法 KP 在图像平面中重新投影3d点 P ,其中 K 是(假设方形像素)矩阵

f 0   a
0  f  b
0  0  1

其中 f 是以像素大小表示的焦距, [ - a,-b] ^ t 是图像coorrdinates系统的中心(表示)以像素为单位)。有关详细信息,您可以直接使用固有的相机参数",或者查看快速而肮脏的解释herehere。也许我的其他answer可以提供帮助吗?

注意:在你的情况下,因为你只关心深度,你不需要 a b ,你可以将它们设置为< strong> 0 ,只需设置 f

PS:如果你不知道 f ,你应该研究相机校准算法(有自动校准方法,但据我所知他们需要很多帧并属于SLAM / SFM领域。但是,我认为你可以在Blender中为一些已知的智能手机型号找到预先计算的内部参数,但它们并没有以上面给出的确切方式表达,你需要转换它们。我正在校准。

答案 1 :(得分:0)

我必须遗漏一些东西,但我觉得这很容易(根据你的假设,包括做某种类型的图像处理来检测物体的前边缘和下边缘以获得h')记住您还假设从物体顶部到相机的距离与从物体底部到相机的距离相同。 (在更远的距离上,这变得没有实际意义,但在近距离时,偏斜实际上可能非常显着)

The standard equation for distance

dist =(focalDist(mm)* objectRealHeight(mm)* imageHeight(pix))/(objectHeight(pix)* sensorHeight(mm))

你可以重新安排这个等式来解决objectRealHeight,因为你知道其他一切......