【问题标题】:How to align RGB and Depth image from Kinect in Matlab如何在 Matlab 中对齐来自 Kinect 的 RGB 和深度图像
【发布时间】:2015-05-02 13:42:47
【问题描述】:

我正在尝试使用 Matlab 对齐来自 Kinect 的 RGB 和深度图像。我正在尝试使用来自this 页面的算法来做到这一点。

这是我目前写的代码

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;

我特别不明白为什么我们将深度像素的值分配给 3 维空间的 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)

我也不确定是否可以使用矩阵表示 3d 空间。我正在尝试在我的代码中使用它,但可以肯定它的大小错误,因为不可能乘以 3x3 旋转矩阵。

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

【问题讨论】:

    标签: matlab kinect


    【解决方案1】:

    这是一个相当复杂的话题,需要简短的回答。据我所知,代码是正确的。请阅读有关内在和外在相机矩阵的信息。并且阅读透视投影也将帮助您了解 2D 到 3D 投影。

    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). View synthesis for advanced 3D video systems. EURASIP Journal on Image and Video Processing, 2008(1), 1-11.

    2. Daribo, I., & Saito, H. (2011). A novel inpainting-based layered depth video for 3DTV. Broadcasting, IEEE Transactions on, 57(2), 533-541.

    【讨论】:

    • 非常感谢您的回答。尽管如此,我的问题不是理解等式的右边,而是左边。我不明白我们实际上在计算什么。 'P3D.x' 是否为我们提供了坐标 x 在 3d 像素系统中来自 2d 的坐标(x_d,y_d)?那么这是否意味着我们在 2d 坐标 (x_d,y_d) 中有像素,这些公式让我们可以用坐标 (P3D.x, P3D.y, P3D.z) 计算 3d 系统中的点坐标?然后我们在空间(P3D.x,P3D.y,P3D.z)点中分配深度(x_d,y_d)的值?
    • 是的,这里的P3D代表3D世界坐标x、y、z。所以我们使用 P3D.x 和 P3D.y 坐标将 2D 图像坐标 (x_d, y_d) 投影到世界 (x, y) 坐标。然后对于 z,深度相机的值已被分配。
    猜你喜欢
    • 2014-03-17
    • 2016-01-15
    • 1970-01-01
    • 1970-01-01
    • 2014-08-17
    • 2016-07-01
    • 1970-01-01
    相关资源
    最近更新 更多