gpt4 book ai didi

c++ - 电影坐标到世界坐标

转载 作者:行者123 更新时间:2023-11-27 23:58:23 31 4
gpt4 key购买 nike

我正致力于使用 OpenCV3.1 和 OpenGL 通过特征匹配构建 3D 点云。

我已经实现了 1) 相机校准(因此我有相机的固有矩阵)2) 特征提取(因此我在像素坐标中有 2D 点)。我浏览了几个网站,但通常都建议将 3D 对象点转换为像素点的流程,但我正在做完全反向投影。这是 ppt这很好地解释了这一点。

我已经从像素坐标(x,y)(借助本征矩阵)实现了胶片坐标(u,v)。谁能阐明我如何从胶片坐标 (x,y) 渲染相机坐标 (X,Y,Z) 的“Z”。

请指导我如何利用 OpenCV 中的函数实现预期目标,例如 solvePnP、recoverPose、findFundamentalMat、findEssentialMat。

最佳答案

在固定旋转平台上使用单个摄像头和旋转对象,我会实现如下内容:

setup

每个相机都有分辨率 xs,ys 和视场 FOV 由两个角度定义 FOVx,FOVy 所以要么检查你的相机数据表或测量它。从该距离和垂直距离 (z),您可以将任何像素位置 (x,y) 转换为相对于相机的 3D 坐标 (x',y',z')。所以首先将像素位置转换为角度:

ax = (x - (xs/2)) * FOVx / xs 
ay = (y - (ys/2)) * FOVy / ys

然后计算 3D 中的笛卡尔位置:

x' = distance * tan(ax)
y' = distance * tan(ay)
z' = distance

这很好,但在普通图像上我们不知道距离。幸运的是,在这样的设置中,如果我们转动我们的物体,那么如果穿过相机的垂直平面,任何凸边都会在侧面产生最大的 ax 角度。因此,检查几帧,如果检测到最大 ax,您可以假设它是位于 distance 处的对象的边缘(或凸起)。

如果您还知道平台的旋转角度 ang(相对于您的相机),那么您可以使用 rotation 计算未旋转的位置围绕 y 轴的公式(链接中的 Ay 矩阵)和相对于相机的已知平台中心位置(只是在取消旋转之前的减法)...正如我提到的,所有这些都只是简单的几何。

简而言之:

  1. 获取校准数据

    FOVx、FOVy、xs、ys、距离。一些相机数据表只有 FOVx,但如果像素是矩形的,您可以根据分辨率计算 FOVy 为

    FOVx/FOVy = xs/ys

    当心使用多分辨率相机模式时,每种分辨率的 FOV 可能不同!!!

  2. 为每一帧提取视频中对象的轮廓

    您可以减去背景图像以简化检测

  3. 获取每一帧的平台角度

    所以要么使用 IRC 数据,要么将已知标记放在旋转盘上并检测/插值...

  4. 检测ax最大值

    只需检查剪影的 x 坐标(分别针对图像的每个 y 行),如果检测到峰,则将其 3D 位置添加到您的模型中。假设旋转矩形框。它的一些框架可能看起来像这样:

    max ax

    因此检查所有帧上的一条水平线并找到最大的ax。为了提高准确性,您可以通过转动平台进行闭环调节,直到“准确”找到峰值。分别对所有水平线执行此操作。

    顺便说一句。如果您在几帧内没有检测到 ax 变化,这意味着具有相同半径的圆形...因此您可以将每个这样的帧处理为 ax 最大值。

生成 3D 点云非常简单。您可以按平台角度对其进行排序,以便于转换为网格...该角度也可以用作纹理坐标...

但不要忘记,您会丢失一些隐藏在轮廓中的凹面细节!!!

如果这种方法还不够,您可以使用相同的设置进行立体 3D 重建。因为每次旋转都表现为新的(已知的)相机位置。

关于c++ - 电影坐标到世界坐标,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40902886/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com