Microsoftは、Kinectの視野角は垂直方向に43度、水平方向に57度であると述べています(記載 ここ )。これらを前提として、固有のパラメータ、つまり焦点と投影の中心を計算できますか?投影の中心は(0,0,0)として与えられると思いますか?
ありがとう
編集:私がやろうとしていることに関するいくつかの詳細情報
Kinectで記録された画像のデータセットがあり、ピクセル位置(x_screen、y_screen、z_world(mm))を実世界の座標に変換しようとしています。
カメラが実世界の座標系の点(x '、y'、z ')に配置されていることがわかっている場合は、次の手順で実世界の座標を見つけるだけで十分です。
x_world = (x_screen - c_x) * z_world / f_x
y_world = (y_screen - c_y) * z_world / f_y
どこ c_x = x'
およびc_y = y'
およびf_x, f_y
焦点距離は?また、視野の知識だけで焦点距離を見つけるにはどうすればよいですか?
ありがとう
世界の原点(0,0,0)をカメラの焦点(いわゆる投影の中心)およびと同一視すると、カメラは正のz軸に沿ってポイントすると、平面x = 0では状況は次のようになります。
ここで、軸はz(水平)とy(垂直)です。下付き文字v
は「ビューポート」または画面を表し、w
はワールドを表します。
意味が正しければ、画面の高さ(ピクセル単位)h
がわかります。また、zw
、yv
、およびxv
。 yw
とxw
を知りたい。この計算では、ビューポートの中央に(0,0)があることに注意してください。左上隅に(0,0)を指定して、通常の画面座標系に合わせて適切に調整します。少しトリガーを適用します。
_tan(43/2) = (h/2) / f = h / (2f), so f = h / ( 2 tan(43/2) )
_
および同様の三角形
_yw / zw = yv / f also xw / zw = xv / f
_
解決する:
_yw = zw * yv / f and xw = zw * xv / f
_
これは、カメラの「焦点距離」がx方向で等しいことを前提としていることに注意してください。そうである必要はありません。 xw
で最高の精度を得るには、f = w / 2 tan(57/2)
で再計算する必要があります。ここでw
は画面の幅です。これは、f
が真の焦点距離ではないためです。それは単なる変換の定数です。カメラのピクセルが正方形で、光学系に収差がない場合、これら2つのf
計算で同じ結果が得られます。
NB:削除された(不適切な)記事で、OPは、既知のzwではなく、斜辺の長さD:Origin to(xw、yw、zw)と言っているようです。この場合、zw = D * f / sqrt(xv² + yv² + f²)
に注意してください(カメラのピクセルが正方形であると仮定します。そうでない場合は、ある程度のスケーリングが必要です)。それらは上記のように進めることができます。
ここでは評判が低すぎるため、コメントを追加できません。しかし、ビデオストリーム形式とそのセンサーチップのために、kinectのカメラアングルは通常の写真カメラと同じではないことを思い出します。したがって、57度と43度に言及しているSDKは、高さと幅の異なる度の解像度を参照している可能性があります。
320x240ピクセルのビットマップを送信し、それらのピクセルは
Horizontal FOV: 58,5° (as distributed over 320 pixels horizontal)
Vertical FOV: 45,6° (as distributed over 240 pixels vertical).
Zはあなたの角度がわかっているので、正弦の法則で適切な場所を取得できると思います https://en.wikipedia.org/wiki/Law_of_sines