2017-12-25 26 views
1

vision.internal.visionKinectDepthToSkeleton 또는 depthToPointCloud 또는 pcfromkinect와 같은 원시 깊이 이미지에서 실제 xyz를 가져 오는 데는 여러 가지 방법이 있습니다.
문제는 이러한 기능이 어떻게 작동하는지 명확하지 않다는 것입니다. 이 모든 함수는 vision.internal.visionKinectDepthToSkeleton을 사용하고 visionKinectDepthToSkeleton은 .p 파일이며 암호화됩니다.
왜 내가 어떻게 작동하는지 알고 싶습니까? xyz 점을 가져 와서 424 * 512 깊이 이미지로 변환하는 Inverse 함수를 작성하려고합니다.
kinect V1에서 원시 깊이 이미지 데이터를 xyz로 변환하는 명확한 공식이 있지만 kinect V2에 대한 작업 솔루션을 찾을 수 없습니다.
matlab 환경에서 작업하는 것이 좋지만 원하는 것을 사용하여 자유롭게 느껴지십시오.
미리 감사드립니다.kinect V2는 visionKinectDepthToSkeleton 또는 depthToPointCloud 또는 pcfromkinect없이 matlab 원시 깊이 이미지에서 실제 xyz 포인트를 가져옵니다.

답변

1

나는이 일을하는 다음 코드를 가지고있다. 심도 이미지를 읽고 X, Y, Z 값으로 변환합니다. "libfreenect2"포럼에서 얻었을 수도 있습니다. 내재적 매개 변수에 관한 한, 체커 보드 패턴과 함께 calibration toolbox을 사용하여 내가 사용하고 있거나 소유하고있는 값을 사용할 수 있습니다. 여기

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 

위 방정식은 X, Y 및 Z.

대해 유도 된에 기초하여, 카메라 모델을 설명하는 것이다 link