image-processing - 如何从知道现实世界中质心位置的图像和图像投影中获得现实世界中正方形的方位
问题描述
我正在尝试从图像中获取现实世界中正方形的方向。我知道图像中每个顶点的投影,并且通过这个和深度相机,我可以获得质心在现实世界中的位置。
我需要正方形的方向(实际上是平面的法线向量),而深度相机的分辨率不够。相机参数也是已知的。
我已经搜索过,我只发现估计算法对于信息少得多的问题来说太过分了。但在这种情况下,我有很多关于形状、距离、相机、图像等的数据,但我无法得到它。
提前致谢。
解决方案
我假设图像是用普通相机捕获的,并且您的“正方形”可以很好地近似为实际的几何矩形,具有平行的相对边和正交的相邻边
如果您只需要正方形的法线,并且校准了相机(特别是从图像中去除了非线性镜头失真),那么可以从消失点和中心轻松获得。算法如下:
p_i, i=1..4
用齐次坐标表示四个顶点 的图像:p_i = (u_i, v_i, 1)
。i 的顺序并不重要,但在下面我假设它从任何一个顶点开始顺时针。另外,为方便起见,在下面我写i + n
的地方,假设加法是模4,因此,例如,i + 1 = 1
当i = 4
。- 计算覆盖正方形边的线的方程:
l_i = p_(i+1) X p_i
,其中X
表示叉积。 - 计算对角线方程:
d_13 = p_1 X p_3
,d_24 = p_2 X p_4
. - 计算中心:
c = d_13 X d_24
。 - 计算平行边对的消失点:
v_13 = l_1 X l_3
,v_24 = l_2 X l_4
. 它们表示在 3D 中相互正交的两条线的图像方向。 - 计算以正方形中心为根的 3D 正交坐标系的轴的图像,其中两个轴平行于正方形边:
x = c X v_13
,y = c X v_24
. - 最后,平面法线,在 3D 相机坐标系中,是它们的叉积:
z = x X y
.
请注意,消除失真很重要,因为当正方形边几乎平行时,即使是少量的失真也会极大地影响消失点的位置。
如果您想知道为什么会这样,Hartley 和 Zisserman 的“计算机视觉中的多视图几何”的以下摘录应该就足够了:
推荐阅读
- java - 带有 POSTGRES 的 Keycloak 独立模式始终连接到本地数据库
- android - Native View 未填充 React Native View 父级
- delphi - TDataSet OnFilterRecord 事件中过滤掉的记录的可见性
- networking - linux内核如何支持在一个平台设备上探测两个端口?
- laravel - 将文件从 Laravel 应用程序上传到 BitBucket
- ruby-on-rails - 来自控制器的 Ruby on Rails APi 调用逻辑过多。我在哪里以及如何使它更简单?
- mysql - 当我有 CTE 时,将 Set 函数放在 MySQL 的什么位置?
- python - 鼠标停止时如何显示此消息
- python - 我们如何编写查询集来比较不同模型的两个 id 并以 html 形式获取与 id 相关的数据,如名称、地址
- c# - 使用 .NET 4.5 的 64 位应用程序调用本机 DLL 方法时出现错误 0xc0000374