四角形を長方形に投影解除する方法は?


10

tl; dr:射影ジオメトリの数学の問題:点A、B、C、Dがユニットボックスの端のどこかにあるように、以下に示すように投影を与える4x4カメラマトリックスをどのように見つけますか(例:OpenGL正規化デバイス)座標)、およびユニットボックスのコーナーは、光線EA、EB、EC、EDに沿って妥当な場所に落ちますか?

(これは、ホモグラフィ、パースペクティブ、および/またはコリネーションの特殊なケースである可能性があります。用語に精通していません。)


精巧

ビューポート内に四角形のABCDがある場合、それを長方形にマッピングする一意の変換(?)が存在すると思います。下の画像に示すように、ビューポートの四角形のABCDは物理的な「ウィンドウ」として機能し、長方形にマッピングすると、歪んで表示されます。

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

(右側のボックスは、後で説明するNDCを表します)

目標は、右側の画像をすばやく取得することです。画像を取得するためにすべてのポイントをレイトレーシングできます(私はこれを行いました)が、ブレンドやプリミティブなどのようなものを利用したかったので、OpenGLまたは他の射影技法を使用したいと思います。

最初の試み

3 + 1次元の均一座標を3空間(左側)にし、それを2空間の2 + 1次元の均一座標(下)に投影する3x4 カメラマトリックスを見つける問題を解決できると思います。権利)。直接線形変換を使用してこれを解決し、カメラマトリックスの未知のエントリの方程式系を取得し、特異値分解を使用してシステムを解くことができます。Ba=0a(SVD)。私はベクトルEA、EB、EC、ED(Eはあなたの物理的な目またはワールドスペースのカメラ)をプレイメージのポイントとみなし、(0,0)、(1,0)、(1 、1)、(0,1)またはポストイメージ内のポイントとしての何か、およびポイントの各ペアは、SVDにプラグインするいくつかの線形方程式を与えます。結果の行列はEA->(0,0)などをマップします(十分な自由度があると仮定します。つまり、解が一意であるかどうかは不明です。注[a]を参照してください)。

しかし、私の悔しさにこれはOpenGLがどのように機能するかではありません。OpenGLは、3x4マトリックスで3dを2dに直接投影しません。OpenGLには、3次元の点である「正規化デバイス座標」(NDC)が必要です。NDCに投影した後、「ユニット」ボックス内の(-1、-1、-1,1)から(1,1,1,1)までのすべてが描画されます。外のすべてが切り取られます(同種の座標を扱っているため、任意の点(x、y、z、w)が画面に表示されるのは、(x / w、y / w、z / w 、1)は-1から1)までのユニットボックス内にあります。

したがって、問題は次のようになります。いくつかの奇妙に見える立方体を同次座標(具体的には、ABCD(フロントポイント)とA'B'C'D '(バックポイント、非表示)で左側に描かれた立方体)にマッピングする合理的な変換が存在しますか。フロントポイントの後ろに))ユニットキューブに、例えば4x4マトリックスを使用して?どうやってやるの?

私が試したこと

私はより強力なものを試しました:ABCDとA'B'C'D 'を通常のピラミッド型錐台(例:gl錐台)のように見せました(つまり、この架空の設定では、左側の画像に黒い長方形が重なっているだけです)四辺形ではなく)、DLT /直接線形変換を使用して、疑わしい4x4行列を解きました。しかし、試してみたところ、十分な自由度がないようでした...結果の4x4行列は、すべての入力ベクトルをすべての出力ベクトルにマップしませんでした。A、B、C、D、A '(5組の変換前ベクトルと変換後ベクトル)を使用している間、私は/ほぼ/私が望む結果を得ます...ベクトルは正しくマッピングされていますが、たとえばB'、 C '、D'は(-1、-1,1,1)ではなく(3,3,1,1)にマッピングされ、OpenGLによって切り取られます。6番目の点(4x4マトリックスが投影する6組の点)を追加しようとすると、私の解は縮退しているようです(ゼロ、無限)。ここではいくつの自由度を扱っていますか?これは、私たちが知っており、気に入っている通常の4ベクトル(3 + 1次元の同次座標ベクトル)をマッピングする4x4マトリックスで可能ですか?

ランダムなマイナーな考え

4x4マトリックスで任意の立方体を任意の立方体にマッピングすることは不可能だと思いますが、2Dのような任意の凸四角形を他の凸四角形に2Dでマッピングすることは可能だと思ったので混乱します、例えば、Photoshop?...これは射影変換ではできませんか?そして、それはどのように3Dに一般化されますか?......また、4x4行列を見つける試みが失敗した場合、線形代数は、NxN行列が最良の場合にN個を超える線形独立点をN個の目標点にマッピングすることを期待すべきではないと言いますが、どういうわけか均一だと思いますいくつかの隠れた共線性が進行しているため、座標はこれをだますのですか?違いますか?

別の解決策?

典型的な錐台カメラの射影行列を使用して、コーナーに対応する2Dポイントを見つけ、2Dパースペクティブディストーションホモグラフィを実行することもできますが、それがピクセルがレンダリングされた後に発生した場合(フォトショップなど)解像度に問題があります...おそらく、仮説的にNDC空間内のXY平面でこの変換を実行するための行列を見つけ、それを通常の錐台ベースの行列で構成できますか?

(注[a]:自由度:ABCDは、必要に応じて、長方形に作用する射影変換のポストイメージになるようにさらに制約できます...つまり、左側の黒い長方形は、画像フレームのクリップアートモデルを投影した結果)


1
コーナーピンを
ググる

回答:


1

ソリューションは、4つの点を正しく変換する射影変換を探していると思います。

すなわち

y=P×x

x=[x0,x1,1]y=[y0y2,y1y2]

P

これで、代数を使用してこれを実行できますgetPerspectiveTransform。または、OpenCVの:)を使用するだけです。

また、ウィキペディアで同質の座標を調べて、概念をよく理解してください。


ありがとうございました!(私はしばらく前にこれを解決し、あなたのコメントを見たときに今すぐ解決策を投稿しました。)
ninjagecko '20

0

私は直接線形変換を実装することで自分の質問を解決しました。ウィキペディアの例のセクションは私のユースケースでした。

方程式を取得するには、行列(例[x1 x2 x3 x4; x5 x6 x7 x8; x9 x10 x11 x12]:)をSageMathなどのお気に入りのコンピューター代数システムに接続し、必要な行列方程式を図のように解決し、変数に関する解をコードにコピーアンドペーストし、フォーマットを調整します。

次に、必要に応じて特定の寸法をスケーリングまたは無視することで、ソリューションを自分のユースケースに適合させることができます(たとえば、ユースケースに応じて、正規化デバイス座標マトリックスのdepth / z座標を無視します)。

あなたの言語のSVD分解関数またはライブラリが必要になります。

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