オプティカル フローを使用してビデオの手ぶれ補正を行っています。calcOpticalFlowPyrLK をより高速に動作させるために、元の画像を 2 倍に縮小し、その上で関数を実行しています。
ホモグラフ行列 (findHomography で取得) を変更して、元の大きな画像をワープできるようにするにはどうすればよいですか。
オプティカル フローを使用してビデオの手ぶれ補正を行っています。calcOpticalFlowPyrLK をより高速に動作させるために、元の画像を 2 倍に縮小し、その上で関数を実行しています。
ホモグラフ行列 (findHomography で取得) を変更して、元の大きな画像をワープできるようにするにはどうすればよいですか。
これは少し遅れており、あなたの答えはうまくいきますが、追加することが1つあります. getPerspectiveTransform のような関数を当然のことと考えるのは好きではありません。この場合、マトリックスを自分で作成するのは簡単です。2 のべき乗である画像縮小は簡単です。ポイントがあり、それを 2 倍の解像度のイメージに移動したいとします。
float newx = (oldx+.5)*2 - .5;
float newy = (oldy+.5)*2 - .5;
逆に、半分の解像度の画像に移動するには...
float newx = (oldx+.5)/2 - .5;
float newy = (oldy+.5)/2 - .5;
必要に応じて自分で図を描き、それが機能することを確信してください。0 インデックスを覚えておいてください。変換を他の解像度で機能させることを考える代わりに、すべてのポイントを変換の解像度に移動し、変換を使用してから元に戻すことを考えてください。幸いなことに、これらすべてを 1 つのマトリックスで行うことができます。そのマトリックスを構築するだけで済みます。まず、3 つのステップごとにマトリックスを作成します。
//move point to an image of half resolution, note it is equivalent to the above equation
project_down=(.5,0,-.25,
0,.5,-.25,
0, 0, 1)
//move point to an image of twice resolution, these are inverses of one another
project_up=(2,0,.5,
0,2,.5,
0, 0,1)
最終的な変換を行うには、それらを組み合わせるだけです
final_transform = [project_up][your_homography][project_down];
良いことは、任意のホモグラフィに対してこれを一度だけ行う必要があることです。これは getPerspectiveTransform と同じように機能するはずです (そしておそらくより速く実行されます)。これを理解することで、画像解像度の変更に関して遭遇する可能性のある他の質問に対処するのに役立つことを願っています.
計算した変換をBとすると、Bに別のホモグラフィAを掛けて、AB = Cを得ることができます。ここで、Cは両方の変換を行うホモグラフィです。これは、最初にBを適用してからAを適用するのと同じです。getPerspectiveTransformを使用できます。
編集: ABとは、要素ごとの乗算ではなく、行列の乗算を意味しました。
編集2: Aを取得するには、2つの画像の4つの角を同じ順序でgetPerspectiveTransformに渡し、ダウンサンプリングされた画像の角がソースポイントになり、元の画像の角が宛先ポイントになるようにします。