计算深度图像中像素与相机平面的角度

时间:2017-08-10 17:14:40

标签: algorithm matlab kinect angle depth-buffer

我有来自ToF相机(Kinect V2)的z图像。我没有像素大小,但我知道深度图像的分辨率为512x424。我也知道我有70.6x60度的fov。

我问过如何在here之前获得像素大小。在Matlab中,此代码如下所示。

像素越亮,物体越近。

close all
clear all

%Load image
depth = imread('depth_0_30_0_0.5.png');
frame_width = 512;
frame_height = 424;

horizontal_scaling = tan((70.6 / 2) * (pi/180));
vertical_scaling = tan((60 / 2) * (pi/180));

%pixel size
with_size = horizontal_scaling * 2 .* (double(depth)/frame_width);
height_size = vertical_scaling * 2 .* (double(depth)/frame_height);

图像本身是一个旋转30度的立方体,可在此处看到:enter image description here

我现在要做的是计算像素到相机平面的水平角度和相机平面的垂直角度。

我尝试用三角测量来做这个,我计算从一个像素到另一个像素的z距离,首先是水平方向,然后是垂直方向。我用卷积来做这件事:

%get the horizontal errors
dx = abs(conv2(depth,[1 -1],'same'));
%get the vertical errors
dy = abs(conv2(depth,[1 -1]','same'));

在此之后我通过atan计算它,如下所示:

horizontal_angle = rad2deg(atan(with_size ./ dx));
vertical_angle = rad2deg(atan(height_size ./ dy));
horizontal_angle(horizontal_angle == NaN) = 0;
vertical_angle(vertical_angle == NaN) = 0;

这给出了有希望的结果,如:

Vertical angle enter image description here

然而,使用这样一点点复杂的图像,它转过60°和30°。

enter image description here

为水平和垂直角度提供相同的角度图像,如下所示:

vertical3060 horizontal3060

在从彼此中减去两个图像之后,我得到以下图像 - 这表明这两个图像之间存在差异。

enter image description here

所以,我有以下问题:我如何证明这个概念?数学是否正确,测试用例选择得不好?两幅图像中从水平角度到垂直角度的角度差异是否过于接近?计算中是否有错误?

1 个答案:

答案 0 :(得分:0)

虽然我以前的代码看起来不错,但它有一个缺陷。我用较小的图像(5x5,3x3等)测试它,并看到由卷积产生的差异图像(dx,dy)产生的偏移。由于差异图像小于原始图像,因此很难将差异图像(其保持两个像素之间的差异)映射到像素本身。

为了快速修复,我进行了下采样。所以我将过滤器掩码更改为:

%get the horizontal differences
dx = abs(conv2(depth,[1 0 -1],'valid'));
%get the vertical differences
dy = abs(conv2(depth,[1 0 -1]','valid'));

并将角度功能更改为:

%get the angles by the tangent
horizontal_angle = rad2deg(atan(with_size(2:end-1,2:end-1)...
    ./ dx(2:end-1,:)))
vertical_angle = rad2deg(atan(height_size(2:end-1,2:end-1)...
    ./ dy(:,2:end-1)))

我还使用填充功能将角度贴图与原始图像的大小相同。

horizontal_angle = padarray(horizontal_angle,[1 1],0);
vertical_angle = padarray(vertical_angle[1 1],0);