3

プログラミング言語vb.net、C++、またはC#を使用して、同じ2つの画像間のシフトと回転を見つける方法は?

4

5 に答える 5

6

あなたが述べている問題はモーション検出(またはモーション補正)と呼ばれ、現時点で画像およびビデオ処理における最も重要な問題の1つです。いくつかの非常に些細なケースを除いて、簡単な「これを行う 10 行のコード」という解決策は存在しません。

一見些細なケースでさえ、非常に難しいケースです。未知の角度による回転は、モーション検出に使用される特別に調整されたアルゴリズムなしでは簡単に検出できないピクセルごとのわずかな変化を引き起こす可能性があるためです。

于 2009-09-01T07:03:01.827 に答える
1

簡単な答えはありません。2 つの画像間の関係を見つけるために、無料のOpenCVライブラリを使用することができます。

于 2009-09-01T07:09:28.133 に答える
1

画像が非常に似ていて、カメラがわずかに移動したり回転したりしている場合は、非常に複雑な手法を使用しなくても問題を解決できます。その場合、私がすることは、モーショントラッキングアルゴリズムを使用して、ピクセルが画像AからBにどのように「移動」したかを近似する「マップ」である画像シーケンスのオプティカルフローを取得することです。非常に優れたライブラリには、これを行う関数があります: CalcOpticalFlowLKおよびCalcOpticalFlowPyrLK

トリッキーなビットは、オプティカル フローから画像の全体的な回転に移行することです。オプティカル フローを大幅にローパス フィルター処理して、よりスムーズなマップを操作することから始めます。次に、いくつかのロジックを使用して、画像がシフトまたは回転されているだけかどうかをテストする必要があります。シフトするだけの場合、マップ全体が 1 つの「色」になります。つまり、すべてのフロー ベクトルが同じ方向を指します。回転があった場合、ベクトルは回転に応じて異なる方向を指します。

入力画像が上記の方法で必要なほど良くない場合は、特徴記述子を調べて、最初の画像の特定のオブジェクトが 2 番目の画像内にどのように配置されているかを調べます。ただし、これははるかに困難です。

于 2009-09-01T09:49:44.860 に答える
0

画像がまったく同じである場合、たとえばSIFTを使用していくつかの特徴点を抽出し、両方の画像の特徴を一致させることはかなり簡単です。次に、一致する機能の任意の 2 つを使用して、回転と平行移動を見つけることができます。平行移動は、一致する 2 つの特徴点の差にすぎません。1 つのイメージの平行移動を補正し、残りの 3 つの点によって形成される角度として回転角度を取得します。

于 2009-09-01T12:28:16.987 に答える
0

回転と平行移動の 2 つの操作は、どちらの順序でも決定できます。最初に回転を検出する方がはるかに簡単です。後でそれを補正できるからです。両方の画像の向きが同じになると、平行移動は単純な相関の問題になります。

画像の相対的な回転を見つけるには、局所的な勾配を決定するのが最適です。すべての近傍 (たとえば 3x3 ピクセル) について、グレー値を関数 z(x,y) として扱い、9 ピクセルを通る平面を当てはめ、その平面の勾配または勾配を決定します。次に、画像全体、または少なくともその中心で見つけたグラデーションを平均します。2 つの画像は異なる平均値を生成します。その理由の 1 つは、90 度以外の回転では画像が完全に重ならないためですが、一般に、平均勾配の違いは 2 つの間の回転です。

1 つの画像を元に戻したら、相関関係を判断できます。これはかなり標準的な操作です。基本的に、可能なオフセットごとに、2 つの画像がどの程度重なっているかを判断しています。これにより、シフトの見積もりが得られます。

両方を取得したら、平行移動を元に戻し、2 番目の画像をシフトし、両方の画像に共通するピクセルの平均勾配のみを決定することで、回転角度の推定値を調整できます。

于 2009-09-01T10:49:48.280 に答える