OpenCV スティッチャー クラスを使用して、どちらのカメラも動かないステレオ設定から複数のフレームをステッチしようとしています。複数のフレームにまたがって実行すると、スティッチングの結果が悪くなります。私はいくつかの異なる方法を試しましたが、ここで説明します。
使用するstitcher.stitch( )
ビューのステレオ ペアを指定して、いくつかのフレームに対して次のコードを実行しました (は OpenCVオブジェクトVideoFile
のカスタム ラッパーです)。VideoCapture
VideoFile f1( ... );
VideoFile f2( ... );
cv::Mat output_frame;
cv::Stitcher stitcher = cv::Stitcher::createDefault(true);
for( int i = 0; i < num_frames; i++ ) {
currentFrames.push_back(f1.frame( ));
currentFrames.push_back(f2.frame( ));
stitcher.stitch( currentFrames, output_mat );
// Write output_mat, put it in a named window, etc...
f1.next_frame();
f2.next_frame();
currentFrames.clear();
}
これにより、各フレームで非常に良い結果が得られましたが、パラメータはビデオに配置された各フレームで推定されるため、パラメータがわずかに異なるスティッチングの小さな違いを見ることができました.
estimateTransform( )
&の使用composePanorama( )
上記の方法の問題を回避するために、最初のフレームでのみパラメータを推定してから、composePanorama( )
後続のすべてのフレームをステッチすることにしました。
for( int i = 0; i < num_frames; i++ ) {
currentFrames.push_back(f1.frame( ));
currentFrames.push_back(f2.frame( ));
if( ! have_transform ) {
status = stitcher.estimateTransform( currentFrames );
}
status = stitcher.composePanorama(currentFrames, output_frame );
// ... as above
}
悲しいことに、以下の画像のように、2 つのビューが非常に奇妙な方法で離れてしまうバグ (ドキュメントはこちら) があるようです。
フレーム 1:
フレーム 2:
...
フレーム 8:
明らかにこれは役に立たないのですが、基本的に、呼び出されるたびに固有パラメーター行列に定数を掛け続けているバグのせいかもしれないと思いましたcomposePanorama()
。そのため、バグにマイナー パッチを適用して、これが起こらないようにしましたが、スティッチングの結果は良くありませんでした。以下のパッチ ( modules/stitching/src/stitcher.cpp
)、その後の結果:
243 for (size_t i = 0; i < imgs_.size(); ++i)
244 {
245 // Update intrinsics
246 // change following to *=1 to prevent scaling error, but messes up stitching.
247 cameras_[i].focal *= compose_work_aspect;
248 cameras_[i].ppx *= compose_work_aspect;
249 cameras_[i].ppy *= compose_work_aspect;
結果:
この問題を解決する方法を知っている人はいますか? 基本的に、変換を 1 回行ってから、残りのフレームでそれを使用する必要があります (30 分のビデオについて話している)。
理想的には、スティッチャー クラスにパッチを適用するためのアドバイスを探していますが、別のソリューションをハンドコーディングしてみるつもりです。SURF ポイントの検索、それらの相関付け、およびホモグラフィの検索を含む以前の試みは、Stitcher クラスと比較してかなり悪い結果をもたらしたので、可能であればそれを使用したいと思います。