/ / kinect V2 obtém pontos xyz reais da imagem de profundidade bruta no matlab sem visionKinectDepthToSkeleton ou depthToPointCloud ou pcfromkinect - matlab, kinect, kinect-sdk, openkinect, kinect-v2

kinect V2 obtém pontos xyz reais da imagem de profundidade bruta em matlab sem visãoKinectDepthToSkeleton ou depthToPointCloud ou pcfromkinect - matlab, kinect, kinect-sdk, openkinect, kinect-v2

Existem várias maneiras de obter xyz real a partir da imagem de profundidade bruta, como vision.internal.visionKinectDepthToSkeleton ou depthToPointCloud ou pcfromkinect.
O problema é que não está claro como essas funções funcionam exatamente. Todas essas funções usam o vision.internal.visionKinectDepthToSkeleton e o visionKinectDepthToSkeleton é um arquivo .p e criptografado.
Por que eu quero saber como eles funcionam? Porque eu quero escrever uma função inversa para eles que obtêm os pontos xyz e os convertem em imagem de profundidade 424 * 512.
No kinect V1, existe uma fórmula clara para converter dados brutos de imagem em profundidade em xyz, mas não consegui encontrar nenhuma solução funcional para o kinect V2.
É melhor para mim trabalhar no ambiente matlab, mas fique à vontade usando o que quiser.
Desde já, obrigado !

Respostas:

1 para resposta № 1

Eu tenho o seguinte código que faz o trabalho. Ele lê a imagem de profundidade e converte em valores X, Y, Z. Eu posso ter conseguido do "libfreenect2"fórum. No que diz respeito aos parâmetros intrínsecos, você pode usar os valores que eu tenho usado ou criar o seu próprio usando o caixa de ferramentas de calibração juntamente com um padrão de tabuleiro de damas.

function [Xw, Yw, Zw] = Depth2World_v2(fileName, maxDepth)
% Extrinsic parameters of the depth camera. These values are collected
%from the dicussion forum.
fx=367.286994337726;        % Focal length in X and Y
fy=367.286855347968;
cx=255.165695200749;        % Principle point in X and Y
cy=211.824600345805;
k1=0.0914203770220268;
k2=-0.269349746097515;
k3=0.0925671408453617;
p1=0;
p2=0;

% Read the depth image:
% Ex: fileName = "depthImg_0018.ppm";
imgPixels = imread(fileName);
% imgPixels = imgPixels (:, end:-1:1);
x3D = zeros(size(imgPixels));
y3D = zeros(size(imgPixels));
z3D = zeros(size(imgPixels));

% Evaluate coordinates from depth image:
[maxR, maxC] = size(imgPixels);
for r=1:maxR
for c=1:maxC
% The depth value is equal to intensity. But it is stored in mm.
d = double(imgPixels(r,c)) / 1000;
z3D(r,c) = d;
x3D(r,c) = (c - cx) * z3D(r,c) / fx;
y3D(r,c) = (r - cy) * z3D(r,c) / fy;
end
end

Aqui está um ligação explicando o modelo da câmera com base no qual as equações acima são derivadas para X, Y e Z.