使用相机角度失真从屏幕高度查找图像的实际高度

Posted

技术标签:

【中文标题】使用相机角度失真从屏幕高度查找图像的实际高度【英文标题】:Find actual height of image from screen height with camera angle distortion 【发布时间】:2017-04-04 21:21:05 【问题描述】:

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

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

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

【问题讨论】:

皮塔哥拉斯!使用 Pitagoras @Ander Biguri:Pitagoras 是一个很好的解决方案,但是我们知道图像坐标中的 h'。我们需要知道像素大小与相机坐标单位之间的比率。所以我认为我们还需要校准矩阵。如果我错了,请纠正我。 你的图片很不准确。您会看到两个梯形共享一条边,而不是正方形。 @YvesDaoust 是的,很抱歉图片不准确。而这张照片只是我所面临挑战的高度抽象版本。 @Caife:是的,但你没有意识到,由于如此不准确,我们甚至不知道 h' 是什么。 【参考方案1】:

假设您知道校准矩阵K,我发现这是一个比计算角度更简单的解决方案。如上图所示,选择 p1=(x,y)p2=(r,s) 点。既然你说你知道相机到物体的距离,那就意味着你知道这些点在相机坐标中的深度d,并且

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

在相机坐标中为您提供立方体上的对应点。现在你寻找的高度很简单

abs(Q1-Q2)

希望对您有所帮助。

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

f 0   a
0  f  b
0  0  1

其中f是以像素大小表示的焦距,[-a,-b]^t是图像坐标系的中心(表示以像素为单位)。欲了解更多信息,您可以搜索“内在相机参数”,或者查看here 或here 进行快速而肮脏的解释。也许我的另一个answer 可以提供帮助?

注意:在您的情况下,由于您只关心深度,因此不需要 ab,您可以将它们设置为 0,只需设置 f

PS:如果你不知道f,你应该研究一下相机校准算法(有自动校准方法,但据我所知它们需要很多帧并落入 SLAM/SFM 领域)。但是,我认为您可以在 Blender 中为一些已知的智能手机型号找到预先计算的内在参数,但它们并没有以上述确切方式表示,您需要对其进行转换。我会校准。

【讨论】:

哦,我肯定会一直使用校准矩阵来做到这一点。但是如果 but h 的所有距离都是已知的,那么 Pitagoras 也可以工作。 +1 ;) 谢谢!但是校准矩阵到底是什么? @AnderBiguri 我也不知道拍摄角度。【参考方案2】:

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

The standard equation for distance:

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

你可以重新排列这个方程来求解 objectRealHeight,因为你知道其他的一切......

【讨论】:

以上是关于使用相机角度失真从屏幕高度查找图像的实际高度的主要内容,如果未能解决你的问题,请参考以下文章

如何使用相机设置捕获的图像以适合固定高度和宽度的 Imageview

允许滚动视图的高度根据图像大小而改变

角度:组件高度仅限屏幕

使用相机查找对象的尺寸(高度、宽度)

unity获取相机高度

R语言使用magick包的image_scale函数对图像进行缩放(resize)可以自定义从宽度或者高度角度进行缩放