7

X、Y、Zメートルのカメラで仮想オブジェクトを拡張したい。OpenCVにはカメラのキャリブレーション機能がありますが、正確にメートル単位で座標を与える方法がわかりません

Unity でカメラをシミュレートしようとしましたが、期待どおりの結果が得られません。

射影行列を次のように設定し、z = 2.415 + 0.5 に単位立方体を作成します。2.415 は目と投影面 (ピンホール カメラ モデル) の間の距離です。立方体の面は前方クリッピング面にあり、その寸法は単位なので、ビューポート全体をカバーするべきではありませんか?

    Matrix4x4 m = new Matrix4x4();
    m[0, 0] = 1;
    m[0, 1] = 0;
    m[0, 2] = 0;
    m[0, 3] = 0;

    m[1, 0] = 0;
    m[1, 1] = 1;
    m[1, 2] = 0;
    m[1, 3] = 0;

m[2, 0] = 0;
    m[2, 1] = 0;
    m[2, 2] = -0.01f;
    m[2, 3] = 0;

    m[3, 0] = 0;
    m[3, 1] = 0;
    m[3, 2] = -2.415f;
    m[3, 3] = 0;
4

3 に答える 3

5

オブジェクトの拡張を見つけるには、カメラのポーズと向きを見つける必要があります。これは、カメラの外部要素を見つけることと同じです。また、最初にカメラの組み込み関数 (キャリブレーションと呼ばれます) を計算する必要があります。

OpenCV を使用すると、これらすべてを実行できますが、簡単ではなく、自分で作業する必要があります。手がかりを与えます。まず、シーン内の何かを認識して、それがどのように見えるかを認識する必要があります。そのため、このオブジェクトを分析してカメラの姿勢を計算できます。これをマーカーと呼びます。典型的な指標から始めることができます。それらは簡単に検出できます。

このスレッドを見てください。

于 2012-07-13T19:32:27.123 に答える
5

キャリブレーションのグローバル スケール (つまり、3D 空間座標の測定単位) は、使用するキャリブレーション オブジェクトのジオメトリによって決まります。たとえば、フラット チェッカーボードの画像を使用して OpenCV でキャリブレーションを行う場合、キャリブレーション手順への入力は、対応する 3D 点 P のペア (P, p) とその画像 p、3D の (X, Y, Z) 座標です。ポイントは、使用するターゲットのサイズ (およびそれを画像化する光学系) の必要に応じて、mm、cm、インチ、マイルなどで表され、画像の 2D 座標はピクセル単位です。キャリブレーション ルーチンの出力は、これらのメートル法単位で表現された 3D 座標をピクセルに「変換」する一連のパラメーター (射影行列 P および非線形歪みパラメーター k のコンポーネント) です。

キャリブレーション ターゲットの実際の寸法がわからない場合 (または使用したくない場合) は、寸法をごまかすだけで、比率を変更しないままにすることができます (たとえば、正方形は実際の長さは正方形のままです)。その側面は不明かもしれません)。この場合、キャリブレーションは未知のグローバル スケールまで決定されます。これは実際には一般的なケースです。ほとんどのバーチャル リアリティ アプリケーションでは、画像で結果が正しく見える限り、グローバル スケールが何であるかはあまり気にしません。

たとえば、アンジェリーナ ジョリーのビデオにさらにふっくらとした 3D 唇のペアを追加し、それらを元のビデオと合成して、真新しい偽の唇がくっついたまま、彼女の顔に「自然」に見えるようにする場合は、唇の画像と正しく重なるように、偽の唇の 3D モデルを再スケーリングします。コンポジットをレンダリングする CG カメラからモデルが 1 ヤード離れているか 1 マイル離れているかはまったく関係ありません。

于 2012-06-11T13:29:47.770 に答える
4

手動で視野を測定することになりました。FOV がわかれば、射影行列を簡単に作成できます。最終的に射影は ( X*d/Z, Y*d/Z ) の形式であるため、単位について心配する必要はありません。X、Y、Z の単位が何であっても、X/Z の比率は変わりません。

于 2012-07-14T11:35:01.457 に答える