我想在相机的x,y,z米处增加虚拟物体。 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;
答案 0 :(得分:5)
校准的全局比例(即3D空间坐标的测量单位)由您使用的校准对象的几何形状决定。例如,当您使用平板棋盘图像在OpenCV中进行校准时,校准过程的输入是3D点P的对应对(P,p)及其图像p,3D的(X,Y,Z)坐标根据您使用的目标尺寸(以及对其进行成像的光学元件)的要求,点以毫米,厘米,英寸,英里等表示,并且图像的2D坐标以像素为单位。校准程序的输出是一组参数(投影矩阵P的分量和非线性失真参数k),它们将以这些度量单位表示的3D坐标“转换”为像素。
如果你不知道(或者不想使用)校准目标的实际尺寸,你可以捏造它们但保持它们的比例不变(例如,即使正方形仍然是正方形它的真实长度可能是未知的)。在这种情况下,您的校准将确定为未知的全球范围。这实际上是常见的情况:在大多数虚拟现实应用程序中,只要结果在图像中看起来正确,您就不关心全局比例。
例如,如果你想在安吉丽娜朱莉的视频中添加一对更加蓬松的3D嘴唇,并将它们与原始视频合成,这样全新的假嘴唇就能保持附着并且看起来“自然”在她的脸上,你只需要重新缩放假嘴唇的3D模型,使它正确地重叠嘴唇的图像。无论模型是距离CG渲染复合材料的1码还是1英里,都完全无关紧要。
答案 1 :(得分:5)
要查找增强对象,您需要找到相机姿势和方向。这与寻找相机外在因素相同。您还必须首先计算相机内在函数(称为calibraiton)。
OpenCV允许你完成所有这些,但不是微不足道的,它需要你自己的工作。我给你一个线索,你首先需要识别场景中你知道它看起来如何的东西,这样你就可以通过分析这个物体来计算相机的姿势,称之为标记。你可以从典型的基准点开始,它们很容易被发现。
看看这个thread。
答案 2 :(得分:4)
我最终手动测量了视野。一旦您了解FOV,您就可以轻松创建投影矩阵。无需担心单位,因为最终投影的形式为(X * d / Z,Y * d / Z)。无论X,Y,Z的单位是多少,X / Z的比例都保持不变。