matlab - 如何在 Matlab 中对齐来自 Kinect 的 RGB 和深度图像

标签 matlab kinect

我正在尝试使用 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;

我特别不明白为什么我们要将深度像素的值分配给三维空间的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 旋转矩阵是不可能的。

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

最佳答案

这是一个非常复杂的话题,需要用简短的回答来解释。按照我的说法,代码是正确的。请阅读有关内在和外在相机矩阵的信息。阅读透视投影也将帮助您理解 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 .

关于matlab - 如何在 Matlab 中对齐来自 Kinect 的 RGB 和深度图像,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30003005/

相关文章:

unity3d - kinect v2 联合方向到 unity3d 四元数

python - 生成所有可能的无向图

matlab - 在 Matlab 中检查给定原始矩阵和更改矩阵的行交换

matlab - 如何编写一个单元测试断言来检查具有指定标识符和特定消息的错误?

matlab - Matlab 中 scatter3 的图例

Matlab:每隔n个间隔乘以选择行

python - 如何在 OpenKinect 中检测手势(使用 python 包装器)

c# - 在 Kinect 中测量

python - 2019年Kinect-Python-OpenCV的状态

c# - 基于原始 SDK 的 kinect 数据需要什么校正数学