computer-vision - 不同相机 View 之间的映射

我在 Blender 中有一个经过校准的(虚拟)相机,可以观察大致平面的物体。我从第一个相机姿势 P0 制作图像并将相机移动到新姿势 P1。所以我有两个 View 的 4x4 相机矩阵,我可以从中计算相机之间的转换,如下所示。我也知道内在矩阵 K。使用这些,我想将 P0 图像中的点映射到从 P1 看到的新图像(当然,我有要比较的基本事实,因为我可以在相机完成后在 Blender 中渲染移动到 P1)。如果我只在 P0 和 P1 之间旋转相机,我可以完美地计算出单应性。但如果存在平移,则计算出的单应矩阵不会将其考虑在内。理论上说,在计算出M10之后,对于平面场景应该去掉最后一行和最后一列。但是,当我检查 M10 时,我看到平移值在最右边的列中,我将其删除以获得 3x3 单应矩阵 H10。那么,如果没有旋转,H10 就等于单位矩阵。这里出了什么问题?

编辑:我知道图像通过单应性相关,因为给定 P0 和 P1 的两张图像,我可以找到一个单应性(通过特征匹配)将图像从 P0 完美映射到来自 P1 的图像,即使存在平移相机移动。

最佳答案

阅读另外两本书后,我对这个理论变得更加清晰:Hartley 和 Zissermann 的“多 View 几何”(示例 13.2),特别是“3-D 视觉的邀请:从图像到几何模型”(第 5.3 节) .1,平面单应性)。以下是大纲,请查看上述来源以获得详尽的解释。

考虑在 3D 空间中的 2D 平面 P 上的点 p 的两幅图像,两个相机帧之间的变换可以写为:X2 = R *X1 + T (1) 其中 X1X2 是相机帧 1 和 2 中世界点 p 的坐标,分别是 R 旋转和 T 两个相机帧之间的平移。将平面 P 到第一个相机帧的单位法向量表示为 N 并将平面 P 到第一个相机的距离表示为 d,我们可以使用plane equation写成 N.T*X1=d(.T 表示转置),或者等价于 (1/d)*N.T*X1=1 (2 ) 对于平面 P 上的所有 X1。将 (2) 代入 (1) 得到 X2 = R*X1+T*(1/d)*N.T*X1 = (R+(1/d)*T*N.T)*X1。因此,平面单应矩阵 (3x3) 可以提取为 H=R+(1/d)*T*N.T,即 X2 = H*X1。这是从 X1X2 的线性变换。

距离 d 可以计算为平面法线与平面上的点之间的点积。然后,应使用相机内在矩阵 K 计算投影单应性 G = K * R+(​​1/d)*T*N.T * inv(K)。如果您使用的是 Blender 或 Unity 等软件,您可以自己设置相机内在函数,从而获得 K。对于 Blender,this 中给出了一个很好的代码片段很好的答案。

OpenCV 在 this 中有一些不错的代码示例教程;请参阅“演示 3:来自相机位移的单应性”。

https://stackoverflow.com/questions/69945642/

相关文章:

git - 重新启用 Visual Studio Code GitHub 身份验证

r - 使用 spsurvey 在多边形内绘制 GRTS 点

c++ - 如何使用 Boost 在缓冲区中进行二进制序列化

python - TensorFlow 安装错误,未启用 Windows LongPath 支持

python - 如果使用 native ORM,如何避免 Django Rest API 中的 S

ruby-on-rails - `gem install sqlite3` 告诉我 `brew in

node.js - 在配置数据库时连接详细信息不可用 Digital Ocean

javascript - 使用 Vite 构建的 React.js 不包含 service-work

reactjs - “开始故事书”不被识别为内部或外部命令,

kubernetes - 如何在我的 Kubernetes 容器中安装 tar 二进制文件以使 ku