0

以下の変換は私がやりたいことです。

ソース画像の各タイルについて、各コーナーの座標と出力画像の対応する各コーナーの座標がわかっているので、cvWarpPerspectiveを呼び出して各タイルをワープし、四角形を接続して最終的な出力画像を取得できます。 。

cvRemapはこれを1つの変換で実行できますか?はいの場合、cvRemap関数に渡すために必要な座標からマップ(mapxおよびmapy)を作成するにはどうすればよいですか?EmguCVのドキュメントを検索しましたが、cvRemapの例が見つかりませんでした。

ソース画像

出力画像

4

1 に答える 1

5

私はemguの経験がありません(実際にはそれに対する評価は低いです)が、remapとwarpPerspectiveについて説明することができます。emguで対応する関数を見つけるのに役立つ場合があります。

remapは、入力画像と座標再配置マップを取得し、それを出力に適用します。マップには次のような情報が保存されます。ピクセル(1、4)を取得し、それを(3、5)に移動します。マップで定義されていないピクセルは、追加のパラメーターに応じて、0または他の値で埋められます。スムーズな結果を得るために、いくつかの補間も使用することに注意してください。

warpPerspectiveは、幾何学的な遠近法変換を取得し、変換のマップを内部で計算してから、remap()を呼び出して入力に適用します。実際、OpenCVの多くの関数はリマップを使用するか、それを使用できます。WarpAffine、レンズ補正などは、カスタムマップを作成し、remapを呼び出してそれらを適用します。

透視変換は3.3行列Hで定義されます。したがって、入力画像の各座標はH行列に従ってシフトされます。

            [ h11 h12 h13 ]    [ x ]
[x' y' 1] = [ h21 h22 h23 ] *  [ y ]
            [ h31 h32 h33 ]    [ 1 ]

ワープパースペクティブは、デスティネーションイメージの各ポイントに逆変換を適用して、ソースイメージのどこに移動する必要があるピクセルであるかを見つけ、その情報をマップに格納します。

そのコードを取得してアプリでカスタム関数を作成することはできますが、C#でそれを行うのがどれほど簡単かはわかりません。C++は簡単なことだったでしょう。

最後の注意: remap()関数には2つのマップパラメータがありますが、私はマップという用語を使用しました。さらに混乱させるために、それらは完全に異なる意味を持つことができます。

  • 最初の有効な組み合わせは、mapxが幅×高さの画像の1つのチャネルでx座標の座標変換を含む場合です。mapyは、y次元に対応するマップです。座標は浮動小数点値であり、ある画像から別の画像への座標変換が整数値に正確にマップされないという事実を反映しています。例として、ピクセル(2、5)は(3.456、7.293)にマッピングできます。

  • 2番目の可能性は、2つのチャネルのxとyの両方の整数座標をmapxに格納し、2番目のパラメーターmapyに補間重みテーブルを保持することです。通常、最初の形式を生成する方がはるかに簡単ですが、2番目の形式の方が処理が速くなります。sencod形式を理解するには、OpenCVソースを読む必要があります。これは、文書化されていないためです。

于 2012-08-09T08:39:13.823 に答える