このMatlabコードを実行して深度画像を取得すると、得られた結果は480x640の行列になります。最小要素値は0、最大要素値は2711です。2711とはどういう意味ですか?それは、カメラから画像の最も遠い部分までの距離です。しかし、2711の単位は何ですか。そのメートルはフィートですか??
2 に答える
Matlabコードが深さに対して正確に何をするかはわかりませんが、Kinectによって送信される深さが11ビットであるため、おそらく何らかの処理が行われるため、2048を超えてはなりません。それは、またはKinectによって送信された生データへのアクセスを取得するためです。
Kinectによって送信されるデータは適切な距離ではないため(「視差」)、有用な単位に変換するためにいくつかの計算を行う必要があります。
OpenKinectプロジェクトwiki(Kinectに関する有用な情報が含まれています)から:
彼らのデータから、生の11ビットの視差値をセンチメートル単位の深度値に変換するための基本的な1次近似は、100 /(-0.00307 * rawDisparity + 3.33)です。この近似値は、4m離れた場所で約10cm離れており、2.5m以内で2cm未満離れています。
より良い近似は、この投稿のStéphaneMagnenatによって与えられます:距離= 0.1236 * tan(rawDisparity / 2842.5 + 1.1863)メートル単位。-0.037の最終オフセット項を追加すると、元のROSデータが中央に配置されます。黄褐色の近似の合計の二乗の差は0.33cmですが、1/xの近似は約1.7cmです。
上記の測定値を使用して距離を取得したら、(i、j、z)を(x、y、z)に変換するための適切な近似値は次のとおりです。
x = (i - w / 2) * (z + minDistance) * scaleFactor * (w/h)
y = (j - h / 2) * (z + minDistance) * scaleFactor
z = z
Where
minDistance = -10
scaleFactor = .0021.
These values were found by hand.
Kinectの深度カメラとそのキャリブレーションの詳細については、ROS Webサイト(および他の多くのサイト)を参照してください。
データをメートルスケールにマッピングすると、深度画像がわずかに圧縮されます。マップされたデータで平面を検索しようとしたときに、これが問題であることがわかりました。