有很多方法可以从原始深度图像中获取真正的 xyz,例如 vision.internal.visionKinectDepthToSkeleton 或 depthToPointCloud 或 pcfromkinect 。
问题是不清楚这些功能是如何工作的。所有这些功能都使用 vision.internal.visionKinectDepthToSkeleton 和 visionKinectDepthToSkeleton 是一个 .p 文件并加密。
为什么我想知道它们是如何工作的?因为我想为他们编写一个反函数来获取 xyz 点并将其转换为 424*512 深度图像。
在 kinect V1 中,有一个将原始深度图像数据转换为 xyz 的明确公式,但我找不到任何适用于 kinect V2 的解决方案。
在 matlab 环境中工作对我来说更好,但可以随意使用任何你想要的东西。
提前致谢 !
问问题
1412 次
1 回答
3
我有以下代码可以完成这项工作。它读取深度图像并转换为 X、Y、Z 值。我可能从“ libfreenect2 ”论坛得到它。就内在参数而言,您可以使用我一直在使用的值,或者使用校准工具箱和棋盘图案让您拥有。
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 的上述方程。
于 2018-01-26T01:01:15.000 回答