2017-08-10 17 views
2

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°回転します。

vertical3060 horizontal3060

互いに両画像を減算した後、私は、次の画像を取得する:

enter image description here

はこのように水平方向と垂直方向の角度に対して同じ角度の画像を、バック与えます - これらの2つの間に違いがあることを示しています。だから、

enter image description here

、私は次の質問がある:どのように私は証拠この概念をできますか?数学は正しいのですか?テストケースはちょうどよく選ばれていませんか? 2つの画像の水平角と垂直角との角度差が近すぎますか?計算に誤りがありますか?

答えて

0

私の前のコードはよく見えるかもしれませんが、欠陥がありました。小さな画像(5x5,3x3など)でテストし、畳み込みによって作られた差分画像(dx、dy)によって作成されたオフセットがあることを見ました。差分画像は元の画像よりも小さいので、差分画像(2つの画素間の差分を保持する)を画素自体にマップすることは容易ではない。

速い修正のために、私はダウンサンプリングを行います。だから、私はフィルタマスクを変更:

%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); 
関連する問題