7

我想在 x,y,z 米 wrt 相机上增加一个虚拟对象。OpenCV 具有相机校准功能,但我不明白我如何准确地给出以米为单位的坐标

我尝试在 Unity 中模拟相机,但没有得到预期的结果。

我将投影矩阵设置如下,并在 z = 2.415 + 0.5 创建一个单位立方体。哪里 2.415 是眼睛和投影平面之间的距离(针孔相机模型) 由于立方体的面位于前剪切平面并且它的尺寸是单位不应该覆盖整个视口吗?

    Matrix4x4 m = new Matrix4x4();
    m[0, 0] = 1;
    m[0, 1] = 0;
    m[0, 2] = 0;
    m[0, 3] = 0;

    m[1, 0] = 0;
    m[1, 1] = 1;
    m[1, 2] = 0;
    m[1, 3] = 0;

m[2, 0] = 0;
    m[2, 1] = 0;
    m[2, 2] = -0.01f;
    m[2, 3] = 0;

    m[3, 0] = 0;
    m[3, 1] = 0;
    m[3, 2] = -2.415f;
    m[3, 3] = 0;
4

3 回答 3

5

校准的全局比例(即 3D 空间坐标的测量单位)由您使用的校准对象的几何形状决定。例如,当您在 OpenCV 中使用平面棋盘的图像进行校准时,校准过程的输入是 3D 点 P 的对应对 (P, p) 及其图像 p,即 3D 的 (X, Y, Z) 坐标点用毫米、厘米、英寸、英里等表示,具体取决于您使用的目标尺寸(以及成像它的光学器件),图像的 2D 坐标以像素为单位。校准例程的输出是以这些度量单位表示的 3D 坐标“转换”为像素的参数集(投影矩阵 P 的分量和非线性失真参数 k)。

如果您不知道(或不想使用)校准目标的实际尺寸,您可以捏造它们但保持它们的比率不变(例如,即使真实长度,正方形仍然是正方形它的一面可能是未知的)。在这种情况下,您的校准将在未知的全球范围内确定。这实际上是常见的情况:在大多数虚拟现实应用程序中,您并不真正关心全局范围是多少,只要结果在图像中看起来正确即可。

例如,如果您想在安吉丽娜·朱莉的视频中添加一对更蓬松的 3D 嘴唇,并将它们与原始视频合成,以使全新的假嘴唇保持附着并在她的脸上看起来“自然”,您只需要重新缩放假嘴唇的 3D 模型,使其与嘴唇图像正确重叠。模型是离渲染合成的 CG 相机 1 码还是 1 英里,这完全无关紧要。

于 2012-06-11T13:29:47.770 回答
5

要找到增强对象,您需要找到相机姿势和方向。这与寻找相机外在因素相同。您还必须首先计算相机内在函数(称为 calibraiton)。

OpenCV 允许您完成所有这些工作,但并非易事,它需要您自己完成。我给你一个线索,你首先需要在场景中识别出你知道它看起来如何的东西,这样你就可以通过分析这个物体来计算相机的位姿,称之为标记。您可以从典型的基准开始,它们很容易被发现。

看看这个线程

于 2012-07-13T19:32:27.123 回答
4

我最终手动测量了视野。了解 FOV 后,您可以轻松创建投影矩阵。无需担心单位,因为最终投影的形式为( X*d/Z, Y*d/Z )。无论 X、Y、Z 的单位是什么,X/Z 的比率都保持不变。

于 2012-07-14T11:35:01.457 回答