微软称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)与相机焦点(投影中心)相等,并假设相机指向正z轴,则情况在x平面中如下所示= 0:
这里的轴是z(水平)和y(垂直) . 下标
v
适用于"viewport"或屏幕,w
适用于世界 .如果我的意思正确,你知道
h
,屏幕高度(以像素为单位) . 此外,zw
,yv
和xv
. 你想知道yw
和xw
. 请注意,此计算在视口的中心有(0,0) . 使用左上角的(0,0)适当调整通常的屏幕坐标系 . 应用一点触发:和类似的三角形
解决:
请注意,这假设摄像机的"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²)
(假设相机像素是方形;如果不是,则需要进行一些缩放) . 你可以像上面那样继续 .我无法添加评论,因为我的声誉太低了 . 但我提醒说,由于视频流格式及其传感器芯片,kinect的摄像机角度与普通照相机不同 . 因此,提到57度和43度的SDK可能指的是高度和宽度的不同度分辨率 .
它发送一个320x240像素的位图,这些像素与之相关
Z已知你的角度是已知的,所以我使用正弦法可以得到你正确的位置然后https://en.wikipedia.org/wiki/Law_of_sines