1

私はopencvを使用して2つの画像間のアフィン変換を推定しています(これをAとBと呼び、AからBまで推定したい)。可能な限り最良の推定を行うには、RANSACを実装する必要があります。これまでのところ、RANSACのフレームワーク(両方の画像とそれらの間の一致のキーポイントがすでにあることを考慮して):

1:ランダムに一致するものを3つ選択し、AとBの一致点を関数getAffineTransformへの入力として使用します。

2:関数warpAffineを使用してAからのポイントをワープし、結果をBのポイントと比較して、外れ値の割合を取得します。

3:サンプルのサイズが3ポイント(getAffineTransformは変換を見つけるために3ポイントが必要)であり、外れ値eの割合があることを考慮すると、RANSACを実行する必要がある回数を見つけることができます。 N回である良い推定;

4:最小の外れ値率で変換を維持しながらステップ1と2をN回再実行します。

基本的な考え方は問題ないようですが、実行、特にステップ2で問題が発生しています。問題は、外れ値の数をテストする方法がわからないことです。ワープアフィンを使用してAからBのポイントをマッピングすることを考えましたが、関数がポイントのマット(Mx2マットであり、Mはポイントの数であり、マップしたいポイントのセットではなく、画像としてポイントの座標xとyを列に並べます。これどうやってするの?

私はc++でopencv2.4.2を使用しています。

4

2 に答える 2

0

私自身の質問に答えて、私は実際にそれをする方法を見つけました。それが最善の方法かどうかはわかりませんが、これまでに行ったテストに基づくと、問題なく機能しているようです。

ここで説明したように

http://docs.opencv.org/doc/tutorials/imgproc/imgtrans/warp_affine/warp_affine.html#warp-affine

アフィン変換は、行列の乗算として表現できる変換です。したがって、変換を適用することは、getAffineTransformから取得した行列をポイントに単純に乗算することで構成されます。単一のポイントをマッピングする前に、マッピングするポイントに「1」を追加して転置し(列ベクトルがあるため)、変換行列を掛けてマッピングする必要があります。Mx2ポイント行列を次の形式の3xMポイント行列に変換すると、すべてのポイントに対してこのマッピングを簡単に拡張できます。

|x1, x2, x3, ...., xM|
|y1, y2, y3, ...., yM|
| 1,  1,  1, ....,  1|

そしてそれを変換行列で乗算します!これがどのように機能するかを示すために作成した簡単なテストプログラムを使用して、後でこの投稿を編集する可能性があります。

また、このベクトルを追加して転置するために、次のことを行っています。

1 - Create a new 3 x M matrix consisting of ones with Mat::ones, named newPtMat
2 - transpose my original point matrix, and keep it in a temp Mat
3 - use temp.copyTo(newPtMat.rowRange(0, 2)

これが最も効率的な方法かどうかはわかりません。より良い提案があれば、コメントを残してください。

于 2012-09-08T20:20:53.253 に答える
0

「findTransformsECC」と呼ばれる新しい関数を使用して、2つの画像間のアフィン変換ワープマトリックスを検索できます。http://docs.opencv.org/3.0-beta/modules/video/doc/motion_analysis_and_object_tracking.html#findtransformecc

私はそれがOpencv3.0+で利用可能だと思います

于 2016-09-02T11:43:48.243 に答える