Kinectの3Dポイントを使用したキーストーン補正


15

XNAでは、床に投影される単純な長方形を表示しています。プロジェクタは任意の位置に配置できます。明らかに、投影された長方形は、プロジェクターの位置と角度に応じて歪みます。Kinectは床をスキャンして、四隅を探します。ここでの私の目標は、元の長方形を変形して、長方形を基本的にプリワープすることで投影が歪まないようにすることです。

私の最初のアプローチは、すべてを2Dで行うことでした。まずwarpPerspective()、スキャンしたポイントから内部の四角形のポイントへの透視変換(OpenCVを使用)を計算し、四角形に逆を適用します。これは機能しているように見えましたが、GPUでレンダリングできないため遅すぎました。

2番目のアプローチは、XNAのレンダリング機能を使用するために3Dですべてを行うことでした。最初に、プレーンを表示し、Kinectでコーナーをスキャンして、受信した3Dポイントを元のプレーンにマッピングします。理論的には、2Dアプローチで行ったように、透視変換の逆を平面に適用できます。ただし、XNAはビューと投影行列で機能するwarpPerspective()ため、次のような関数を呼び出して目的の結果を取得することはできません。カメラのビューと投影マトリックスの新しいパラメーターを計算する必要があります。

質問:これらのパラメーターを計算し、2つのマトリックス(ビューとプロジェクション)に分割することは可能ですか?そうでない場合、私が使用できる別のアプローチはありますか?


1
XNAはビューと投影行列を使用しますが、最終結果=ベクトル*ビュー*投影と思います。ビューを恒等行列にし、逆透視行列を投影し、それが機能するかどうかを確認してみませんか?(これが正確に起こることを100%確信していない)
ロイT.

1
遠近法変換をどの程度正確に計算しましたwarpPespectiveか?私はOpenCVに精通していませんが、ドキュメントを読むと、この関数は画像に遠近感を適用するように見えます。それとも混乱していますか?とにかく、最初の実装に詳細を追加すると役立つかもしれません。
ローランCouvidou

PCLライブラリ(pointclouds.org)をご覧ください。kinectから深度画像を変換すると、カメラが原点にあり、z軸に沿ってポイントする点群が得られます。その後、ransacまたは別のアルゴリズムを使用して飛行機を検索できます。
Exilyth

回答:


1

ベクトル代数はGPUに優しいため、正規化とドット積を使用して、次のように元の平面の4つの角を見つけることができます。

ここに画像の説明を入力してください

投影点(P)、投影点(B)、歪んだ長方形を含む平面上の任意の1点(Q)、その平面の法線ベクトル(n)、交差点(A) PからBへの線、および平面は

s = -dot_product(n, P - Q) / dot_product(n, normalized(B - P)) 
A = P + s * normalized(B-P)

ソースhttp://geomalgorithms.com/a05-_intersect-1.htmlセクションライン平面交差点

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.