graphics - 计算相机光线方向到 3d 世界像素

标签 graphics camera pixel trace

我想用给定的高度计算从相机到像素位置(以世界坐标表示)的光线方向,如 this paper 中所述.相机图像大小为 640,480。我校准了相机的内在参数并使每个图像不失真。我测量了相机和背景平面(29 厘米)之间的物理距离,如下所示:

Scene

1 cm 转换为 25 像素(假设为二次像素)。我的第一种方法是根据像素和相机位置进行计算,如下所示:

float3 pixPos = (float3)(u, v, z);
float3 camPos = (float3)(height/2, width/2, 29*25);
float3 ray = normalize(pixPos-camPos);

其中 u,v 是从 0,0 到高度、宽度的图像坐标,z 是我的(已经估计的)高度值。这似乎不是正确的方法。我已经对 SO 进行了搜索并找到了 this answer ,但那里描述的解决方案不包括像素高度(此处为 z)。

最佳答案

几年前,当我写毕业论文时,我正在解决同样的问题。这是它的一部分,描述了如何创建用于光线跟踪的相机。

首先,您需要定义相机的坐标系。它是正交坐标系,这意味着所有三个基向量都相互垂直并且具有相同的大小(不必是“一个”)。另外你需要指出的是,如果你的相机坐标系是right-handed or left-handed (我将谈论左撇子)。首先你需要定义 up vector (矢量显示屏幕上的 y 轴是什么)和 camera direction vector (所以从眼睛位置到投影平面中间的向量)。然后你会计算left vector (如果需要,也可以使用右向量)(它指向屏幕上 x 轴的确切位置) by cross productup vectorcamera direction vector .现在,因为只有相机方向向量和左向量肯定是垂直的,所以你必须让 one more cross productcamera direction vectorleft vector (图像上的向量 y)。

所以你会得到像这样的相机协调系统

left handed camera coordination system

不,您必须定义,您的投影屏幕在世界坐标中的大小。这有时可能很棘手,因此您也可以通过两个角度来定义它 phi and theta angles ( phitheta )以及与眼睛位置的距离(我们称之为 d )。

你会得到 u vectorv vector . (x 向量是在屏幕上定义 x 轴的向量,所以它是 left vector 或右向量,取决于惯用手)
通过这两个向量的线性组合 uv您可以计算投影屏幕上的任何位置。系数 alpha alphabeta虽然代表距离 the point从投影屏幕的中间。

所以alpha coefficientbeta coefficient ,其中 srxy计算图像上的坐标和 imageWidthimageHeight是合适的尺寸。

所以正如你在这张图片上看到的

projection plane

投影平面上任意点的最终位置是point on projection plane .

那么请求向量的计算是desired vector .

关于graphics - 计算相机光线方向到 3d 世界像素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14094042/

相关文章:

matlab:在 500x500 像素 .jpg 图像中找到绿色边缘的 x-y 位置

javascript - Three.js中如何获取透视相机的 Angular 值?

algorithm - 如何在不压缩的情况下解码 PNG 文件的 IDAT block

r - 如何在 R 中将默认绘图类型从点更改为线?

java - 无法重绘Java中的场景

c++ - 在 C++ 中使用 OpenCV 从摄像机流式传输视频时程序不会启动

android - OnPictureTaken() 计时/保存问题

python - 无需导入非标准库即可查找给定位置的像素颜色

c++ - 在 C++ 中加速图像过滤器

algorithm - 如何计算多条曲线的 OBB?