3

Kinect と OpenCV を使用してフィンターチップの座標を Flash にエクスポートし、ゲームやその他のプログラムで使用するプロジェクトに取り組んでいます。現在、セットアップは色に基づいて機能し、指先のポイントを (x、y、z) 形式で Flash にエクスポートします。x と y はピクセル単位、z はミリメートル単位です。

ただし、Flash 内の z 深度値を使用して、これらの (x, y) 座標をミリメートルなどの「実世界」の値にマップする必要があります。

私が理解しているように、Kinect 3D の深度は、X 軸をカメラの水平方向に、Y 軸をカメラの垂直方向に、Z 軸をカメラのレンズから直接前方に投影することによって得られます。深度値は、任意のオブジェクトから XY 平面に引いた垂線の長さです。以下のリンクの写真を参照してください (Microsoft の Web サイトから取得)。

Microsoft 深度座標系の例

また、Kinect の水平視野は 117 度の角度で投影されることがわかっています。

この情報を使用して、任意の点の深度値を x=0、y=0 の線に投影し、その点で XY 平面に平行でカメラの視野と交差する水平線を引くことができると考えました。問題のオブジェクトの深さの高さで、半分に分割された三角形になります。次に、少し三角法を使用して視野の幅を解くことができます。私の方程式は次のとおりです。

W = tan(シータ / 2) * h * 2

どこ:

  • W = 視野幅
  • theta = 水平視野角 (117 度)
  • h = 深度値

(写真は載せられないので、できれば載せます)

ここで、深さの値 1000mm (1 メートル) を解くと、約 3264mm の値が得られます。

しかし、生成されたカメラ画像を実際に見ると、異なる値が得られます。つまり、カメラから 1 メートル離れた場所にメーター スティックを置いたところ、フレームの幅が計算で推定された 3.264 メートルではなく、最大で 1.6 メートルであることに気付きました。

私がここに欠けているものはありますか?どんな助けでも大歓迎です。

4

3 に答える 3

4

深度ストリームは正しいです。実際に深度値を取得する必要があります。その後、Kinect センサーから、Kinect に対する現実世界のポイントを簡単に見つけることができます。これは単純な三角法によって行われますが、深さの値は Kinect の「目」から測定点までの距離であるため、直方体の対角線であることに注意してください。

実際には、このリンクに従ってください。Kinect を使用して個別のオブジェクトから現実世界の座標 (x、y、z) を取得する方法

書き直しても無駄です。そこに正しい答えがあります。

于 2012-11-09T20:52:13.263 に答える
2

いくつかのこと:

A) Kinect センサーの関数から 117 度の FOV を得たことは知っていますが、それが正しいとはまだ信じていません。それは巨大なFOVです。Kinect でこの関数を実行したときに実際に同じ数値が得られましたが、まだ信じられません。57 (または一部の情報源では 58.5) は低いように見えますが、間違いなくより合理的です。Kinect を平らな面に置き、オブジェクトをビューのすぐ内側に配置して、FOV を測定します。正確ではありませんが、100 度を超えることはないと思います。

B) 実際の距離と Kinect の報告された深度を比較した記事を見ました。それは線形ではありません。これは、実際には 1.6 メートルのトリガーの問題には影響しませんが、今後は注意が必要です。

C) Kinect から現実世界のポイントを受け入れるようにコードを変更することを強くお勧めします。さらに良いのは、可能であれば、より多くのデータを送信することです。引き続き現在のデータを提供し、実際の座標データをそれに追加するだけです。

于 2012-08-02T20:08:28.687 に答える
0

ベクトル減算は、Kinect によって与えられた任意の 2 点間の距離を取得する必要があります。特定の環境でベクトル減算を実行するための最良の方法を調べる必要がありますが、とにかくこれが役立つことを願っています. 私が使用する Processing には、PVector クラスがあります。ここで、単純に PVector difference = PVector.sub(vector1, vector2) を減算します。ここで、vector1 と vector2 は 2 点を表すベクトルであり、difference は間の新しいベクトルです。 2点。次に、差分ベクトルの大きさが必要です。繰り返しますが、処理では、これはマグニチュード = difference.mag() によって単純に検出されます。その大きさが目的の距離になるはずです。

処理中のベクトルと一般的なベクトルの両方の概要を以下に示します: https://processing.org/tutorials/pvector/

于 2016-02-20T02:28:33.240 に答える