我正在使用相机内在(fx,fy,cx,cy,width,hight)来存储TangoXyzIjData.xyz缓冲区的深度图像。因此,我为xyz的每个点计算相应的图像点并存储其z值
x' = (fx * x) / z + cx
y' = (fy * y) / z + cy
depthImage[x'][y'] = z
现在我想存储相应的姿势数据。我正在使用TangoXyzIjData.timestamp的时间戳和以下函数
getPoseAtTime(double timestamp, TangoCoordinateFramePair framePair)
with framepair
new TangoCoordinateFramePair(TangoPoseData.COORDINATE_FRAME_START_OF_SERVICE, TangoPoseData.COORDINATE_FRAME_DEVICE)
问题在于姿势是设备帧与服务帧的开始。并且深度图像从深度相机帧获得其点。我怎样才能匹配它们?
有一种方法可以通过以下方式将深度相机点转换为设备帧:
现在我可以用point2Device将点云的每个点相乘。但这是对设备框架的转变。
有没有办法将设备姿势转换为相机姿势?
答案 0 :(得分:2)
你放在一起的等式是正确的!但它还没有完成。
为了正式化终端,让我们使用a_T_b
作为转换矩阵,其中a
表示基本帧,b
表示目标帧。相对于a_T_b
框架,a
为b
框架。
根据您的问题,我们知道的矩阵是:
start_service_T_device
,imu_T_device
,imu_T_depth
我们想要获得的矩阵是:
start_service_T_depth
我们可以使用"矩阵链"得到结果:
start_service_T_depth = start_service_T_device *
inverse(imu_T_device) *
imu_T_depth;
现在,让我们说我们在深度框架中有一个点P_depth
。要为此点应用姿势并将其转换为start_service
帧,我们可以使用:
P_ss = start_service_T_depth * P_depth;
在大多数情况下,您可能希望将其转换为一些易于图形库渲染的坐标框架。以我们的OpenGL为例,我们可以将这一点转换为OpenGL世界坐标系,如下所示:
请注意,start_service_T_opengl_world
是一个可以手动计算的常量矩阵。 Here是矩阵的链接,引自Project Tango c ++示例。
P_gl = opengl_world_T_start_service * P_ss;
我们可以扩展我们刚刚编写的所有内容并将其放在一个等式中:
P_gl = opengl_world_T_start_service *
start_service_T_device *
inverse(imu_T_device) *
imu_T_depth *
P_depth;