2013-05-31 9 views
5

Open Cvの新機能です.2つの画像srcとdst画像を変換したいと思います。私はcv::estimateRigidTransform()を使って変換行列を計算してから、cv::warpAffine()を使ってdstからsrcに変換します。新しい変換画像とsrc画像を比較すると、ほぼ同じ(変換済み)ですが、新しい変換画像とsrc画像のabs差分を取得すると、大きな違いがあります。私のdstイメージには回転と並進の要素も含まれています。ここに私のコードOpencv Transforming Image

cv::Mat transformMat = cv::estimateRigidTransform(src, dst, true); 
cv::Mat output; 
cv::Size dsize = leftImageMat.size(); //This specifies the output image size--change needed 
cv::warpAffine(src, output, transformMat, dsize); 

Srcのイメージ

enter image description here

先イメージ

enter image description here

出力画像

enter image description here

です

絶対差の像

enter image description here

おかげ

+0

まず、正確に何を達成したいですか? もちろん、一般的な変換を行う場合、abs-diffはゼロではありません。 1度の回転変化でさえ、画素補間のために大きな変化を引き起こす。 – jnovacho

+0

こんにちは、jnovacho、私はopencvを使用して画像を修正したい – Mudasar

+0

私はまだ問題が表示されません。あなたのコードは私にとってはうまくいくようです。送信元と宛先の画像と出力画像のスクリーンショットを提供できますか? – jnovacho

答えて

4

あなたは、プロセスに関するいくつかの誤解があります。

メソッドcv :: estimateRigidTransformは、入力として2セットの対応するポイントを取ります。そして、変換行列を見つけるために一連の方程式を解きます。変換の出力は、src点をdst点に一致させます(完全一致が不可能な場合は正確にまたは密接に - たとえば浮動小数点座標)。

2つの画像にestimateRigidTransformを適用すると、OpenCVはまず内部的な方法(opencv docsを参照)を使って一致する点のペアを見つけます。

cv :: warpAffineは与えられた変換マトリックスに従ってsrcイメージをdstに変換します。しかし、どんな(ほとんどの場合でも)変換は損失操作です。アルゴリズムは利用できないため、一部のデータを推定する必要があります。このプロセスは、未知の値を計算する既知の情報を使用して補間と呼ばれます。画像スケーリングに関する情報はwikiにあります。回転、スキュー、パースペクティブなどの他の変換にも同じ規則が適用されます...これは翻訳には当てはまりません。

あなたのテスト画像があれば、私はOpenCVがランプシェードを参考にしていると思います。その違いから、ランプシェードが最良に変形されていることは明らかです。デフォルトでは、OpenCVは線形補間を使用して最速の方法であるため、ワーピングに使用します。しかし、より良い結果を得るために、より進歩的な方法を設定することができます - opencv docsに再度ご相談ください。

結論: あなたが気づいた結果は、自動化されたプロセスの結果です。より良い結果が得られるようにするには、対応するポイントを選択する別の方法を見つける必要があります。または、より良い補間方法を使用してください。どちらの方法でも、変換後、diffは0にならないでしょう。ビットマップはピクセルの離散したグリッドなので、実際には実現できません。したがって、常にいくつかのギャップがあり、推定する必要があります。

+0

[OK]を感謝:)は、あなたは、ステレオ画像における時間のほとんど回転しながら、実際には左上隅からそれを回転している、どのようにワープアフィンを適用する前に、中央に回転を設定するために私を伝えることができます中心から来ています。ありがとう – Mudasar

+0

こんにちはjnovachoため – Mudasar

+1

こんにちは、 キャッチがあります。全ての変換は原点[0,0]に関する。したがって、ここでのトリックは、目的の中心を原点に変換し、回転させて元に戻すことです。マトリックス変換に関するいくつかの情報はこちらhttp://www.willamette.edu/~gorr/classes/GeneralGraphics/Transforms/transforms2d.htmある しかし、私はあなたがデータを失ったと同じように、これは、OpenCVのに働くだろうとは思いません負の座標。プラス私はあなたが本当にこれを必要とは思わない。関数はこの問題を内部的に処理し、対応する点が一致するように画像を変換します。それはないゴナ作業が:) – jnovacho