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
A
답변
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