5

ビデオストリームを安定させるプログラムを作成しています。現在、私のプログラムは位相相関アルゴリズムに基づいて動作しています。ベースと現在の 2 つのイメージ間のオフセットを計算しています。次に、新しい座標に従って現在の画像を修正します。このプログラムは機能しますが、結果は満足のいくものではありません。処理されたビデオが望ましくないように見え、ビデオ全体を揺さぶる関連リンクが悪化している可能性があります。
元のビデオ
手ブレのないビデオ
私の現在の認識があり
ます: 画像間のオフセットの計算:

Point2d calculate_offset_phase_optimized(Mat one, Mat& two) {

  if(two.type() != CV_64F) {
    cvtColor(two, two, CV_BGR2GRAY);
    two.convertTo(two, CV_64F);
  }

  cvtColor(one, one, CV_BGR2GRAY);
  one.convertTo(one, CV_64F);

  return phaseCorrelate(one, two);

}

この座標に従って画像をシフトする:

void move_image_roi_alt(Mat& img, Mat& trans, const Point2d& offset) {

  trans = Mat::zeros(img.size(), img.type());
  img(
    Rect(
        _0(static_cast<int>(offset.x)),
        _0(static_cast<int>(offset.y)),
        img.cols-abs(static_cast<int>(offset.x)),
        img.rows-abs(static_cast<int>(offset.y))
    )
  ).copyTo(trans(
    Rect(
        _0ia(static_cast<int>(offset.x)),
        _0ia(static_cast<int>(offset.y)),
        img.cols-abs(static_cast<int>(offset.x)), 
        img.rows-abs(static_cast<int>(offset.y))
    )   
  )); 
}

int _0(const int x) {
  return x < 0 ? 0 : x;
}

int _0ia(const int x) {
  return x < 0 ? abs(x) : 0;
}

ドキュメント作成者のスタビライザー YouTube を調べていて、コーナー検出に基づくアルゴリズムは魅力的に見えましたが、それがどのように機能するかは完全にはわかりません。だから私の質問は、この問題を効果的に解決する方法です。条件の 1 つ - プログラムは低速のコンピューターで実行されるため、負荷の高いアルゴリズムは適していない可能性があります。
ありがとう!
PS テキストに誤りがありましたらお詫び申し上げます - これは自動翻訳です。

4

2 に答える 2

3

各フレームでSIFTなどのイメージ記述子を使用して、フレーム間のロバスト マッチを計算できます。次に、フレーム間のホモグラフィを計算し、それを使用してそれらを整列させることができます。疎な特徴を使用すると、密な相関を使用するよりも実装が速くなります。

または、カメラのパラメーターがわかっている場合は、ポイントとカメラの3D 位置を計算し、画像を安定した投影面に再投影できます。その結果、シーンのまばらな 3D 再構成も得られます(やや不正確です。通常、使用できるようにするには最適化する必要があります)。これは、たとえばAutostitchが行うことですが、実装するのは非常に困難です。

カメラのパラメータも計算できることに注意してください。ただし、それはさらに困難です。

于 2014-05-21T07:58:33.750 に答える
2

OpenCV は 3 行のコードでそれを行うことができます (これは間違いなく最短の方法であり、最善の方法かもしれません):

t = estimateRigidTransform(newFrame, referenceFrame, 0); // 0 means not all transformations (5 of 6)
if(!t.empty()){    
    warpAffine(newFrame, stableFrame, t, Size(newFrame.cols, newFrame.rows)); // stableFrame should be stable now
}

行列 t を変更することで、ある種の変換をオフにすることができます。これにより、より安定した結果が得られます。これは単なる核となるアイデアであり、必要に応じて変更できます: referenceFrame の変更、行列 t からの変換パラメーターのスムーズなセットなど。

于 2014-11-02T09:07:31.087 に答える