2016-08-23 11 views
1

シーンに較正ターゲット(既知のジオメトリ)がある画像があります(単純な2 "x 2"の正方形をテーブルに置いてみましょう)。私は(カメラの軸がテーブルの法線と平行であるかのように)結果の画像がテーブルの直交ビューであるように(warpPerspective()を使用して)透視変換を実行したいと思います。ホモグラフィを計算するための標準的な手順は、一般的な平面から異なる一般平面へのものであり、同じシーンの2つの画像において少なくとも4つの対応が知られている(getPerspectiveTransform()を使用)。私が1つの画像しか持っていないこの場合、単純に平面を構成し、その平面上の任意の位置に対応させるのは正しいことですか?たとえば、この状況では、画像の4つの検出されたコーナー(A、B、C、D)と私の選択した4つのポイント(単にピクセル - >実世界スケールを定義する)の間の対応をとるだけです。結果として得られる画像中に10個の画素があることを示すために、A '=(0,0)、B' =(20,20)、C '=(0,20)、D' =(20,0) A '=(100,100)、B' =(120,120)、C '=(100,120)、(C' = 100,100)とすることができます。3D平面から画像平面に平行な平面のホモグラフィ

これは「正しい」方法ですか?既知の画像内のポイントのセットによって定義される平面を直接見る射影変換を計算するより良い方法がありますか?飛行機にいる?

+0

こんにちはDavid!うん、それは正しいと思う。少なくとも、私はこれを正確に行い、それはかなりうまくいった。 – Miki

+0

@Mikiありがとう!ちょうど私が何かを見逃していなかったことを確認するだけで、私は誰もインターネット上のどこでもこれを説明することを見ていないので、常に奇妙に見える。 –

+1

ああ、誰もが説明してくれた:) :) "ホモグラフィを使ったパースペクティブコレクション" http://www.learnopencv.com/homography-examples-using-opencv-python-c/ –

答えて

2

私は1つのイメージしか持たないこの場合、単純にプレーンを構成し、対応をそのプレーン上の任意の位置に強制する正しいことはありますか?

はい。

この実装では、getPerspectiveTransformには正確に4つの対応が必要であることに注意してください。それは8自由度([3,3]要素は1に固定されている)を持つ3x3遠近法変換を見つけるので、4つの非線形対応が必要であり、そのような対応は十分である。対照的に、findHomographyはRANSACを使用して不確実性に対処し、が信頼されたであり、どちらがの外れ値であるべきかを決定することができます。線形最小二乗法を採用したい場合は、getPerspectiveTransformを採用して> = 4ペアを受け入れることができます。

ただし、歪んだ四角いターゲットTを完全な正方形に変換する透視変換を適用すると、Tと同じ平面上にある平面だけが線平行になります。他のプレーン(例えば、Tに対して垂直)は、変換後に線平行ではありません。

パースペクティブを削除する場合、つまり投影を正書法に変更する場合は、パースペクティブトランスフォームのみで行うことはできません。また、シーン内のオブジェクトの深さを知り、それを視点なしで平面に投影する必要があります。

+0

a)一般的に、Direct Linear Transformメソッドは任意の数の*既知の対応を取ることができ、それらをすべて使って最小二乗の意味で "最良"の行列を計算する(RANSACで "有効"と扱う対応を決定するのと比べて) - これは 'getPerspectiveTransform ) 'はしますか? b)変換された画像は、関心平面上の点の「正書法」になります。 –

+0

(a)はい、 'getPerspectiveTransform'は最小二乗の意味で線形変換を計算しますが、現在の実装では、正確に4つの対応が必要です。どの数字も受け入れるように修正するのは簡単です。https://github.com/opencv/opencv/blob/b3b434e221b99a237b989cfbf90ffe6e6af6fab1/modules/imgproc/src/imgwarp.cpp#L6453(b)はい。 – szym

関連する問題