如何在Matlab中对Kinect的RGB和深度图像进行对齐

3
我正在尝试使用Matlab对Kinect的RGB和深度图像进行校准。我正在尝试使用来自页面的算法进行操作。
以下是我目前编写的代码:
depth = imread('depth_00500.png');
color = imread('rgb_00500.png');

rotationMat=[9.9984628826577793e-01 1.2635359098409581e-03 -1.7487233004436643e-02;
 -1.4779096108364480e-03 9.9992385683542895e-01 -1.2251380107679535e-02;
1.7470421412464927e-02 1.2275341476520762e-02 9.9977202419716948e-01 ];

 translationMat=[1.9985242312092553e-02, -7.4423738761617583e-04, -1.0916736334336222e-02 ];

%parameters for color matrix
fx_rgb= 5.2921508098293293e+02;
fy_rgb= 5.2556393630057437e+02;
cx_rgb= 3.2894272028759258e+02;
cy_rgb= 2.6748068171871557e+02;
k1_rgb= 2.6451622333009589e-01;
k2_rgb= -8.3990749424620825e-01;
p1_rgb= -1.9922302173693159e-03;
p2_rgb= 1.4371995932897616e-03;
k3_rgb= 9.1192465078713847e-01;

%parameters for depth matrix
fx_d= 5.9421434211923247e+02;
fy_d= 5.9104053696870778e+02;
cx_d= 3.3930780975300314e+02;
cy_d= 2.4273913761751615e+02;
k1_d= -2.6386489753128833e-01;
k2_d =9.9966832163729757e-01;
p1_d =-7.6275862143610667e-04;
p2_d =5.0350940090814270e-03;
k3_d =-1.3053628089976321e+00;

row_num=480;
col_num=640;

for row=1:row_num
    for col=1:col_num

pixel3D(row,col,1) = (row - cx_d) * depth(row,col) / fx_d;
pixel3D(row,col,2) = (col - cy_d) * depth(row,col) / fy_d;
pixel3D(row,col,3) = depth(row,col);

    end
end

pixel3D(:,:,1)=rotationMat*pixel3D(:,:,1)+translationMat;
pixel3D(:,:,2)=rotationMat*pixel3D(:,:,2)+translationMat;
pixel3D(:,:,3)=rotationMat*pixel3D(:,:,3)+translationMat;

P2Drgb_x = fx_rgb*pixel3D(:,:,1)/pixel3D(:,:,3)+cx_rgb;
P2Drgb_y = fy_rgb*pixel3D(:,:,2)/pixel3D(:,:,3)+cy_rgb;

我很难理解为什么我们要将深度像素的值分配给三维空间的x、y和z维度,难道不应该将(x、y、z)维度分配给深度像素值吗?
我的意思是这部分:
P3D.x = (x_d - cx_d) * depth(x_d,y_d) / fx_d
P3D.y = (y_d - cy_d) * depth(x_d,y_d) / fy_d
P3D.z = depth(x_d,y_d)

我不确定是否能用矩阵来表示三维空间。虽然我正在尝试在我的代码中使用它,但由于无法通过3x3旋转矩阵相乘得到正确的大小,因此我非常确定它是错误的。

非常感谢您提供的每一个建议和帮助!

1个回答

3
这是一个相当复杂的话题,无法用简短的回答来解释。我认为代码是正确的。请阅读有关内在和外在相机矩阵的内容。阅读透视投影的相关内容也将帮助您理解二维到三维的投影。
P3D.x = (x_d - cx_d) * depth(x_d,y_d) / fx_d

在上述行中,depth(x_d, y_d)会为您提供来自深度图像的像素的深度值。然后乘以(x_d - cx_d),这是沿x轴与深度地图中心点的x坐标之间的差异。最后,将其除以fx_d,即深度相机的焦距。
如果您对此感兴趣,以下两个参考资料将帮助您全面理解这一数学概念。
  1. Mueller, K., Smolic, A., Dix, K., Merkle, P., Kauff, P., & Wiegand, T. (2008). 高级3D视频系统的视图合成。EURASIP图像和视频处理杂志,2008年(1),1-11

  2. Daribo, I.,& Saito, H.(2011)。一种新颖的基于修复的分层深度视频技术用于3DTV。IEEE广播事务杂志,57(2),533-541


非常感谢您的回答。然而,我的问题不在于理解等式的右侧,而是左侧。我无法理解我们实际上正在计算什么。 'P3D.x'是否为给出像素在2d坐标系中的x坐标,从而使我们能够计算具有坐标(P3D.x,P3D.y,P3D.z)的点在3d系统中的像素坐标(x_d,y_d)?这是否意味着我们在2d坐标系中具有坐标(x_d,y_d)的像素,并且这些公式让我们计算点在3d系统中的坐标,其坐标为(P3D.x,P3D.y,P3D.z)?然后,我们将深度(x_d,y_d)的值分配给空间中(P3D.x,P3D.y,P3D.z)点的深度? - Tai Na
是的,这里的P3D代表三维世界坐标x、y和z。因此,我们使用P3D.x和P3D.y坐标将2D图像坐标(x_d,y_d)投影到世界(x,y)坐标上。然后,深度相机的值已被分配给z值。 - Huá dé ní 華得尼

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接