首页 文章

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

提问于
浏览
6

我想计算具有给定高度的摄像机到像素位置(在世界坐标中)的光线方向,如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) .

1 回答

  • 13

    几年前,当我写论文时,我正在解决同样的问题 . 以下是介绍如何为光线追踪创建相机的一部分 .

    首先,您需要定义摄像机的坐标系 . 它必须是"one") . 如果您的相机坐标系是right-handed or left-handed(我将谈论左撇子),您还需要指出 . 首先,您需要定义 up vector (向量显示屏幕上的y轴是什么)和 camera direction vector (因此从眼睛位置到投影平面中间的向量) . 然后,您将通过 up vectorcamera direction vectorcross product 计算 left vector (或右侧向量,如果需要)(它指向屏幕上x轴的确切位置) . 现在,因为只有相机方向矢量和左矢量是垂直的,你必须使 camera direction vectorcamera direction vectorleft vector (图像上的矢量y) .

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

    left handed camera coordination system

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

    你会得到
    u vector

    v vector
    . ( x 向量是在屏幕上定义x轴的向量,因此它是 left vector 或右向量,取决于手性)通过这两个向量 uv 的线性组合,您可以计算投影屏幕上的任何位置 . 系数
    alpha
    alpha
    beta
    虽然表示投影屏幕中间的距离 the point .

    所以
    alpha coefficient

    beta coefficient
    ,其中 sr 是您计算图像上的 xy 坐标, imageWidthimageHeight 是合适的尺寸 .

    所以你可以在这张图片上看到

    projection plane

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

    然后计算请求的向量是
    desired vector
    .

相关问题