首页 文章

来自视野的Kinect内在参数

提问于
浏览
12

微软称Kinect的视角为垂直43度,横向为57度(声明为here) . 鉴于这些,我们可以计算内在参数,即焦点和投影中心吗?我假设投影中心可以给出(0,0,0)?

谢谢

EDIT: some more information on what I'm trying to do

我有一个用Kinect记录的图像数据集,我试图将像素位置(x_screen,y_screen和z_world(mm))转换为真实世界坐标 .

如果我知道相机放置在真实世界坐标系中的点(x',y',z'),通过执行以下操作就足以找到真实世界的坐标:

x_world = (x_screen - c_x) * z_world / f_x
y_world = (y_screen - c_y) * z_world / f_y

其中 c_x = x'c_y = y'f_x, f_y 是焦距?而且,只要了解视野,我怎样才能找到焦距?

谢谢

2 回答

  • 0

    如果您将世界原点(0,0,0)与相机焦点(投影中心)相等,并假设相机指向正z轴,则情况在x平面中如下所示= 0:

    Diagram of cameral world coordinates

    这里的轴是z(水平)和y(垂直) . 下标 v 适用于"viewport"或屏幕, w 适用于世界 .

    如果我的意思正确,你知道 h ,屏幕高度(以像素为单位) . 此外, zwyvxv . 你想知道 ywxw . 请注意,此计算在视口的中心有(0,0) . 使用左上角的(0,0)适当调整通常的屏幕坐标系 . 应用一点触发:

    tan(43/2) = (h/2) / f = h / (2f),  so f = h / ( 2 tan(43/2) )
    

    和类似的三角形

    yw / zw = yv / f            also              xw / zw = xv / f
    

    解决:

    yw = zw * yv / f            and                xw = zw * xv / f
    

    请注意,这假设摄像机的"focal length"在x方向上相等 . 它不一定是 . 为了在 xw 中获得最佳精度,您应该使用 f = w / 2 tan(57/2) 重新计算,其中 w 是屏幕宽度 . 这是因为 f isn 't a true focal length. It'只是一个转换常数 . 如果相机的像素是方形的并且光学器件没有像差,则这两个计算将得到相同的结果 .

    NB: 在一篇删除的(不正当的)文章中,OP似乎说它不是已知的但是斜边的长度D:起源于(xw,yw,zw) . 在这种情况下,请注意 zw = D * f / sqrt(xv² + yv² + f²) (假设相机像素是方形;如果不是,则需要进行一些缩放) . 你可以像上面那样继续 .

  • 19

    我无法添加评论,因为我的声誉太低了 . 但我提醒说,由于视频流格式及其传感器芯片,kinect的摄像机角度与普通照相机不同 . 因此,提到57度和43度的SDK可能指的是高度和宽度的不同度分辨率 .

    它发送一个320x240像素的位图,这些像素与之相关

    Horizontal FOV: 58,5° (as distributed over 320 pixels horizontal)
    Vertical FOV: 45,6° (as distributed over 240 pixels vertical).
    

    Z已知你的角度是已知的,所以我使用正弦法可以得到你正确的位置然后https://en.wikipedia.org/wiki/Law_of_sines

相关问题