ヘッドトラッキングまたは2次元モニターで3次元ケトルを見る方法

前学期、コンピュータービジョンコースを受講し、最終的にはこれに関連するトピックについて最終プロジェクトを行わなければなりませんでした。 ウェブカメラを使用してユーザーの目を追跡し、直角から3Dオブジェクトを表示することが可能かどうかは、私にとって興味深いことになりました。 つまり モニターから仮想世界にウィンドウを作成します。 今、私はそれをどうやってやったか、途中で出会った落とし穴についてユーザーと共有したいと思います。



目はどこですか?



その時は時間がなかったので、すべてを一からやりたくありませんでした。 ためらうことなく、私はFaceAPIをトレーニング目的のために無料でやめ、彼女を苦しめ始めました。 いくつかの苦痛の後、頭だけでなく目の位置も非常によく決定でき、最も重要なことは、Webカメラの座標系で各目の3D位置と方向をすぐに与えることができることが判明しました。



目は何を見ていますか?



だから、目の位置があります。今、彼らが見るものを見つける必要があります。 ちなみに、ユーザーは2つの実際の目の間の1つの作業目を持つサイクロープであると想定されています。 OpenGLの仮想カメラをユーザーの目が見える場所にねじ込むことですべてを簡単かつシンプルにする最初の試みは、完全に非現実的であるため成功しませんでした。





純粋に主観的で、ケトルが近づくにつれて大きくなるのは悪いことでした。 私はここで何が間違っていたのか考え始め、即興的な手段で簡単な実験さえ行いました:





穴のサイズに対する電話のサイズに注意してください。 近づくと、ティーポットは増加するのではなく、逆に減少するはずです(「窓」の外にある場合)。 これは次のようになります。





別の問題があります。側面から見ると、比率が歪んでいます。 問題は、OpenGLが画像をビューに垂直であるかのようにレンダリングしますが、ユーザーはモニターの平面を斜めに見ることです。





その結果、画像が歪んでしまいます。





そして、写真では正しい画像が左側ではなく右側にあります。 モニターの右側(ユーザーの頭がほぼそこにあった)で見ると、正しくなり、左側のものがゆがんでいます。



見たものを修正するには?



両方の問題を一挙に修正するには、ユーザーが実際の画面で見た場合とまったく同じように画面に表示されるようにする必要があります。 さまざまな方法でこれを行うことができますが、その瞬間に私は次のように思いつきました。以前のようにすべてをレンダリングする必要がありますが、実際の世界のモニター領域に対応するレンダリング画像の領域を探します。 これを行うには、定規を装備し、ディスプレイとカメラに対する各角度の位置を測定し(SKが取り付けられている)、シーンの3次元空間でその位置を取得し、モニターのウィンドウの物理的な位置を計算する必要がありました。 写真は、3次元空間のモニター上のウィンドウに対応するフレームを示しています。





次に、この領域の内容をウィンドウ全体に拡大する必要があります。 これを行うには、OpenGL画像がレンダリングされるディスプレイプレーンの3D空間のモニター上の実際のウィンドウのコーナーに対応するポイントを投影し(実際にはこれらのポイントの座標に投影マトリックスを掛けます)、ホモグラフィーを見つけます(ホモグラフィーは、1つのイメージへの対応を確立できるマトリックスです)別のポイント、OpenCVを使用してそれを見つけるか、ペンですべてを書くことができます)結果の四角形と実際のディスプレイ上のウィンドウの四角形の間でレンダリングされた画像を四角形にマッピングします NIKU実際の表示画面(再びOpenCVのは、私たちを助けるために)。



結果は、このウィンドウが仮想世界への実際のウィンドウである場合に人が見るものの正しい画像です。



確かに、もう1つ些細なことがあります。ユーザーがモニターから遠く離れている場合、FOVが一定であれば、画像の実際の部分(実際にはモニターを通して見える部分)は非常に小さいことがわかります。





最終画像の解像度は低くなります。





これに対処するために、有用な画像が可能な最大の領域よりも少し少なくなるようにFOVを再計算します。





結果は、適切な(私はそのように考えたが、詳細については後で)画像を含むかなりまともな画像です。



どうしたの?



このすべての結果はビデオで見ることができます:





そして今、主観的な観点からそれがどのように機能するかについてのいくつかのコメントとその理由:



1)最大の問題は、ラップトップ上のWebカメラの視野角が小さいことです。 したがって、可視性を超えるのは非常に簡単で、画像は停止します。 彼女はこれに適応していません。 しかし、良いニュースは、すべてが十分に高速であり、速度の点で問題がないことです。 自然界にはもっと広角のものがありますが、それを手に入れる必要があります。



2)人間の脳を欺くのはそれほど簡単ではありません。 2つの目で、モニターが平らであり、ステレオなしではこの3Dが機能しないことを確認できます。 片方の目を閉じても、脳はとにかく、これがフラットモニターであり、ケトルがそこにないことを知っています。 ただし、1つの注意点があります。片目を閉じて、常に3次元のやかんを想像すると、しばらくすると脳をだますことができます。



3)プロジェクションのすべてが一見簡単に見えるとは限りません。 個人的には、スクリーンの背後にあるオブジェクトに近づくとオブジェクトが減少するというのはかなり奇妙でした。 ちなみに、バグがここに隠れています。やかんはボリュームがあり、画面の平面上にあったため、私がやったようにできません。 ティーポットの各上部の位置を個別に再計算する必要があります。



4)次の学期にも同じことをしようとしますが、ステレオ3Dをサポートし、目ごとに別々の画像を表示します。 脳が信じているかどうか見てみましょう。



更新



労働者の要請で、私はソースバイナリを広めました。 すべてのdllをバイナリに含めたため、アーカイブ内で24メートルになりました。



また、実験中に何かを壊したようです。やかんは非常に長くなっています(投影すると記号がどこかで変わったように感じますので、やかんは間違った方向に伸びています)理解します。



また、別の機能として、ティーポットを備えた2つのウィンドウがあります。一方をもう一方に移動する(ドラッグする)だけで正しいので、デバッグに便利です)。



ティーポットの失われたモデルはここにあり、 ここにあります:C:\ _ WORK \ __ 3d_Models \



All Articles