我在这里做了一些研究来理解这个主题,但没有取得好的结果。我正在使用 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
我的错误在哪里?我究竟做错了什么?提前致谢。
附言。对不起,我的英语不好。