matlab - 如何在 Matlab 中将 Kinect 原始深度信息转换为米?

标签 matlab kinect kinect-sdk

我在这里做了一些研究来理解这个主题,但我没有取得好的结果。我正在使用 Kinect for Windows 和 Kinect SDK 1.7。我正在使用 matlab 处理原始深度图信息。

首先,我使用此方法 ( https://stackoverflow.com/a/11732251/3416588 ) 将 Kinect 原始深度数据存储到文本文件中。我得到了一个包含 (480x640 = 307200) 个元素和数据的列表,如下所示:

23048
23048
23048
-8
-8
-8
-8
-8
-8
-8
-8
6704
6720
6720
6720
6720
6720
6720
6720
6720
6736
6736
6736
6736
6752
0
0

然后在 Matlab 中我将这个值转换为二进制。所以,我得到了 16 位数字。对应于玩家索引的最后三个数字是“000”,所以我将它们删除。现在,我从 13 位数字中删除了更有意义的数字,它始终为“0”。

所以,我做了这个:

[0,1,1,0,0,0,1,0,0,0,1,1,1,0,0,0] - 16 bits number
[0,1,1,0,0,0,1,0,0,0,1,1,1] - 13 bits number
[1,1,0,0,0,1,0,0,0,1,1,1] - 12 bits number

然后我按照此过程 (https://stackoverflow.com/a/9678900/3416588) 将原始深度信息转换为米,但我得到的值在 -4.7422 到 0.3055 的范围内。它们是什么意思?

clc
clear all
close all

%Get raw depth data from .txt
fileID = fopen('C:\Example.txt', 'r');
datos = fscanf(fileID, '%i'); % Data in decimal
fclose(fileID);

% If raw depth data is less than 0, set it to 0
for i = 1 : 640*480
 if(datos(i) < 0)
   datos(i) = 0;
 end
end

% Auxiliar arrays
datosBin = zeros(640*480, 16);
realDepth = zeros(640*480, 12);

% Decimal raw depth data to binary
n = 16;
m = 0;
for i = 1 : 640*480
 a = datos(i);
 datosBin(i,:) = fix(rem(a*pow2(-(n-1):m),2));
end

% Remove player index and msb (more significant bit)
for i = 1 : 640*480
 realDepth(i,:) = datosBin(i,2:13);
end

% Auxiliar array to store raw depth data decimal number
realDepthDec = zeros(640*480,1);

% Raw depth data 12 bits to decimal
for i = 1 : 640*480
 realDepthDec(i) = bin2dec(num2str(realDepth(i,:)));
end

% Auxiliar array
rawDepthMapMeters = zeros(480, 640);

% Create array 640*480 to store bit depth info in meters
for j = 1 : 480
 for i = 1 : 640
   if(realDepthDec(i+j) <= 2046)
    rawDepthMapMeters(j, i) = 0.1236 * tan(realDepthDec(i+j)/2842.5 + 1.1863);
   end
 end
end

我的错误在哪里?我究竟做错了什么?提前致谢。

附言。抱歉我的英语不好。

最佳答案

在你阅读的第二篇文章中,你会看到你使用的方法已经过时了。阅读this .

x = (i - w / 2) * (z + minDistance) * scaleFactor
y = (j - h / 2) * (z + minDistance) * scaleFactor
z = z
Where
minDistance = -10
scaleFactor = .0021.
These values were found by hand.

您还可以按照第二个问题中的描述在您的第一个应用程序中将这些点数转换为毫米

using (var depthFrame = e.OpenDepthImageFrame())
{
    var depthArray = new short[depthFrame.PixelDataLength];
    depthFrame.CopyPixelDataTo(depthArray);

    for (int i = 0; i < depthArray.Length; i++) {
        int depthInMillimeters = 
            depthArray[i] >> DepthImageFrame.PlayerIndexBitmaskWidth;
        // TADAx2!
}

关于matlab - 如何在 Matlab 中将 Kinect 原始深度信息转换为米?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22587178/

相关文章:

performance - 如何在matlab中高效生成随机符号/{-1,1}?

c# - 如何从 Kinect 深度数组中获取位置 (x,y)?

c# - 深度图像帧 Kinect V2

opencv - OpenNI 2.2 + OpenCV 2.4.6 + VS 2010

python - 为什么 Matlab interp1 产生的结果与 numpy interp 不同?

matlab - 如何在 matlab 中检索函数参数的名称?

c++ - 为什么 Matlab 给出的值与 C++ 不同

C++、OpenCV 和 Kinect : Processing speed goes down

kinect - OpenNI SDK2,找不到Kinect设备(Ubuntu 13.04)

c# - 使用 C# 的 Kinect v2 颜色深度映射