2017-12-25 18 views
1

vision.internal.visionKinectDepthToSkeletonやdepthToPointCloudやpcfromkinectのような生の深度画像から実際のxyzを取得する方法はたくさんあります。
問題は、これらの機能がどのように正確に機能するかがはっきりしないことです。これらの関数はすべてvision.internal.visionKinectDepthToSkeletonを使用し、visionKinectDepthToSkeletonは.pファイルで暗号化されています。
なぜ彼らはどのように機能するのか知りたいですか?私はxyzポイントを取得し、それを424 * 512の深度イメージに変換する逆関数を書いています。
kinect V1では、生の奥行き画像データをxyzに変換するための明確な式がありますが、kinect V2の実用的な解を見つけることができませんでした。
私はmatlab環境で作業していますが、好きなものを自由に使用してください。
ありがとうございます!kinect V2 visionなしのmatlabの実深度画像から実際のxyzポイントを取得するKinectDepthToSkeletonまたはdepthToPointCloudまたはpcfromkinect

答えて

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あります
関連する問題