ビデオ(または画像)に四角形(必ずしも正方形または長方形である必要はありません)を表す4つの同一平面上の点があり、それらの上に仮想立方体を表示できるようにしたいのですが、立方体の角が正確に角に立っています。ビデオクワッドの。
ポイントは同一平面上にあるため、単位正方形のコーナー([0,0] [0,1] [1,0] [1,1])とクワッドのビデオ座標の間のホモグラフィを計算できます。
このホモグラフィから、正しいカメラポーズを計算できるはずです。つまり、[R | t]ここで、Rは3x3の回転行列、tは3x1の並進ベクトルであり、仮想立方体はビデオクワッド上にあります。
私は多くの解決策を読み(そのうちのいくつかはSOで)、それらを実装しようとしましたが、それらはいくつかの「単純な」場合(ビデオクワッドが正方形の場合など)でのみ機能するようですが、ほとんどの場合は機能しません。
これが私が試した方法です(それらのほとんどは同じ原理に基づいており、翻訳の計算のみがわずかに異なります)。Kをカメラからの固有行列、Hをホモグラフィとします。計算します:
A = K-1 * H
a1、a2、a3をAの列ベクトル、r1、r2、r3を回転行列Rの列ベクトルとします。
r1 = a1 / ||a1||
r2 = a2 / ||a2||
r3 = r1 x r2
t = a3 / sqrt(||a1||*||a2||)
問題は、これがほとんどの場合機能しないことです。結果を確認するために、RとtをOpenCVのsolvePnPメソッドで得られたものと比較しました(次の3Dポイント[0,0,0] [0,1,0] [1,0,0] [1,1 、0])。
同じように立方体を表示しているので、どの場合でもsolvePnPが正しい結果を提供しますが、ホモグラフィから得られたポーズはほとんど間違っていることに気付きました。
理論的には、私のポイントは同一平面上にあるため、ホモグラフィからポーズを計算することは可能ですが、Hからポーズを計算する正しい方法を見つけることができませんでした。
私が間違っていることについての洞察はありますか?
@Jav_Rockのメソッドを試した後に編集する
こんにちはJav_Rock、あなたの答えに感謝します、私はあなたのアプローチ(そして他の多くのものも同様に)を試しました、それは多かれ少なかれ大丈夫のようです。それでも、4つの同一平面上の点に基づいてポーズを計算するときに、まだいくつかの問題が発生します。結果を確認するために、solvePnPの結果と比較します(反復再射影エラー最小化アプローチにより、はるかに優れています)。
次に例を示します。
- 黄色い立方体:PNPを解く
- ブラックキューブ:Jav_Rockのテクニック
- シアン(およびパープル)キューブ:まったく同じ結果が得られた他のいくつかの手法
ご覧のとおり、黒い立方体は多かれ少なかれ問題ありませんが、ベクトルは正規直交しているように見えますが、バランスが取れていないようです。
EDIT2:(正規直交性を強制するために)計算後にv3を正規化しましたが、いくつかの問題も解決しているようです。