ビデオの2つの連続するフレーム間のスケール、回転、および平行移動を計算しようとしています。したがって、基本的にキーポイントを照合し、opencv関数findHomography()
を使用してホモグラフィ行列を計算しました。homography = findHomography(feature1 , feature2 , CV_RANSAC); //feature1 and feature2 are matched keypoints
私の質問は、この行列を使用して縮尺、回転、平行移動を計算するにはどうすればよいですか?.
誰かが私にそれを行う方法についてのコードや説明を提供できますか?
opencv 3.0を使用できる場合は、この分解方法を利用できます http://docs.opencv.org/3.0-beta/modules/calib3d/doc/camera_calibration_and_3d_reconstruction.html#decomposehomographymat
正しい答えは、定義されているとおりにhomographyを使用することですdst = H ⋅ src
そしてそれが特定のポイントの周りの小さなセグメントに何をするかを探ります。
単一のポイントを与えられて、翻訳のために
T = dstH・src)
与えられた2つのポイントp1 およびp2
p1 =H⋅p1
p2 =H⋅p2
ここで、ベクトルp間の角度を計算するだけです。1 p2 およびp1'p2'。
同じトリックを使用できますが、長さを比較するだけです:| p1 p2|および| p1'p2'|。
公平を期すために、最初のセグメントに直交する別のセグメントを使用して、結果を平均します。 ---(no一定のスケール係数または変換係数があることがわかります。それらはsrc
の場所に依存します。
ホモグラフィ変換関数を作成するのに数日間苦労しなければならなかったので、みんなの利益のためにここに置きます。
ここでは、すべての入力位置にホモグラフィ行列hが乗算されるメインループを確認できます。次に、その結果を使用して、ピクセルを元の位置からコピー先の位置にコピーします。
for (tempIn[0] = 0; tempIn[0] < stride; tempIn[0]++)
{
for (tempIn[1] = 0; tempIn[1] < rows; tempIn[1]++)
{
double w = h[6] * tempIn[0] + h[7] * tempIn[1] + 1; // very important!
//H_20 = H_21 = 0 and normalized to H_22 = 1 to obtain 8 DOF. <-- this is wrong
tempOut[0] = ((h[0] * tempIn[0]) + (h[1] * tempIn[1]) + h[2])/w;
tempOut[1] =(( h[3] * tempIn[0]) +(h[4] * tempIn[1]) + h[5])/w;
if (tempOut[1] < destSize && tempOut[0] < destSize && tempOut[0] >= 0 && tempOut[1] >= 0)
dest_[destStride * tempOut[1] + tempOut[0]] = src_[stride * tempIn[1] + tempIn[0]];
}
}
このようなプロセスの後、ある種のグリッドを備えた画像が生成されます。グリッドを削除するには、なんらかのフィルターが必要です。私のコードでは、単純な線形フィルターを使用しました。
注:正しい画像を生成するには、元の画像の中央部分のみが実際に必要です。一部の行と列は安全に破棄できます。
与えられたホモグラフィ行列H
:
|H_00, H_01, H_02|
H = |H_10, H_11, H_12|
|H_20, H_21, H_22|
仮定:
H_20 = H_21 = 0
およびH_22 = 1
に正規化して、8DOFを取得します。
X軸とy軸に沿った平行移動は、H
から直接計算されます。
tx = H_02
ty = H_12
左上隅の2x2
サブマトリックスは、せん断、スケーリング、および回転を計算するために分解されます。簡単で迅速な分解方法が説明されています ここ 。
注:このメソッドは可逆行列を想定しています。
問題は2Dパラメータに関するもののようです。ホモグラフィマトリックスは、遠近法による歪みをキャプチャします。アプリケーションが遠近法による歪みをあまり生成しない場合は、アフィン変換行列(スケール、回転、平行移動のみを使用し、せん断/反転を使用しない)を使用して実際の変換を近似できます。次のリンクは、アフィン変換をさまざまなパラメーターに分解する方法について説明しています。
https://math.stackexchange.com/questions/612006/decomposed-an-affine-transformation
ホモグラフィによって引き起こされる樹木次元の変換と回転を推定するために、複数のアプローチが存在します。 そのうちの1つ ホモグラフィを分解するための閉じた式を提供しますが、それらは非常に複雑です。また、ソリューションは決してユニークではありません。
幸い、OpenCV 3はすでにこの分解を実装しています( decomposeHomographyMat )。ホモグラフィと正しくスケーリングされた固有行列が与えられると、関数は4つの可能な回転と平行移動のセットを提供します。