2017-03-02 11 views
4

私はVisual Studio 2012、C++で複数のイメージステッチングに取り組んでいます。私は自分の要求に応じてstitching_detailed.cppを変更し、品質の結果を得ています。ここでの問題は、実行に時間がかかりすぎることです。 の画像がの場合は、110秒です。複数画像のステッチングを最適化するにはどうすればよいですか?

それはほとんどの時間を取るのはここです:

1)に一致ペアごとに - 55秒10枚の画像のをとります!私はORBを使って特徴点を探しています。ここでは、コードがあります:

vector<MatchesInfo> pairwise_matches; 
BestOf2NearestMatcher matcher(false, 0.35); 
matcher(features, pairwise_matches); 
matcher.collectGarbage(); 

私はすでに画像のシーケンスを知っているように、私は、このコードを使用してみました:

vector<MatchesInfo> pairwise_matches; 
BestOf2NearestMatcher matcher(false, 0.35); 

Mat matchMask(features.size(),features.size(),CV_8U,Scalar(0)); 
for (int i = 0; i < num_images -1; ++i)             
    matchMask.at<char>(i,i+1) =1;              
matcher(features, pairwise_matches, matchMask);           

matcher.collectGarbage(); 

をそれは間違いなく(18秒)時間を短縮しますが、必要な結果を生成しません。のみ6画像は(画像6、画像7つの特徴点は何とか一致していないので、最後の4が省略されており、そのループ休憩。。)ステッチます

2)を合成 - 38秒10枚の画像のを取り!コードは次のとおりです。

for (int img_idx = 0; img_idx < num_images; ++img_idx) 
{ 
    printf("Compositing image #%d\n",indices[img_idx]+1); 

    // Read image and resize it if necessary 
    full_img = imread(img_names[img_idx]); 

    Mat K; 
    cameras[img_idx].K().convertTo(K, CV_32F); 

    // Warp the current image 
    warper->warp(full_img, K, cameras[img_idx].R, INTER_LINEAR, BORDER_REFLECT, img_warped); 

    // Warp the current image mask 
    mask.create(full_img.size(), CV_8U); 
    mask.setTo(Scalar::all(255)); 
    warper->warp(mask, K, cameras[img_idx].R, INTER_NEAREST, BORDER_CONSTANT, mask_warped); 

    // Compensate exposure 
    compensator->apply(img_idx, corners[img_idx], img_warped, mask_warped); 

    img_warped.convertTo(img_warped_s, CV_16S); 
    img_warped.release(); 
    full_img.release(); 
    mask.release(); 

    dilate(masks_warped[img_idx], dilated_mask, Mat()); 
    resize(dilated_mask, seam_mask, mask_warped.size()); 
    mask_warped = seam_mask & mask_warped; 

    // Blend the current image 
    blender->feed(img_warped_s, mask_warped, corners[img_idx]); 
} 

Mat result, result_mask; 
blender->blend(result, result_mask); 

元の画像解像度は4160 * 3120です。私は品質を低下させるので、コンポジットで圧縮を使用していません。私は圧縮された画像を残りのコードで使用しました。

ご覧のとおり、コードを変更して時間を短縮しました。しかし、私はまだ可能な限り時間を短縮したいと思っています。

3)特徴点 - ORBを使用しています。 10画像の場合10秒になります。画像の最大1530個の特徴点を見つけます。コードの残りの

55 + 38 + 10 = 103 + 7 = 110

Iは、Androidにこのコードを使用する場合、それはスマートフォンのほぼ全体メモリ(RAM)を取り実行する。どのように私はアンドロイドデバイスのメモリ消費だけでなく、時間を減らすことができますか? (私が使用したAndroidデバイスは2GBのRAMを持っています)

私はすでにコードの残りの部分を最適化しました。どんな助けでも大歓迎です!

編集1:合成ステップで画像圧縮を使用し、時間が38秒から16秒に短縮されました。私はまた、コードの残りの部分で時間を短縮することができました。

だから、110 - > 85秒から。ペアワイズマッチングの時間を短縮できます。私はそれを減らすための手がかりはありません!

EDIT 2:matchers.cppでペアワイズマッチングのコードが見つかりました。私は時間を最適化するためにメインコードに自分の関数を作成しました。合成のステップでは、最終的な画像が明瞭でなくなるまで圧縮を使用しました。特徴の発見のために、画像スケールを用いて、画像スケールを縮小した画像特徴を発見した。今では50枚まで簡単にステッチすることができます。

答えて

0

55〜18秒がかなり改善されているため、多少のマッチングプロセスを制御できます。私が最初に示唆しているのは、もしあなたがまだいなければ、プロセスのあらゆる段階をデバッグすること、イメージが刻まれていないときに何がうまくいかないのかを理解することです。このようにして、検出しているORB機能の数などを常に制御する方法を学びます。たぶん、あなたがそれらを制限して結果を得ることができるので、プロセスを高速化することができます(これは、機能の発見だけでなく、マッチングプロセスも速くすべきです)。

ループブレイク時に状況を検出できるようになることを願っています。したがって、状況に応じて対応することができます。ループ内のシーケンスは引き続き一致しますが、その特定のペアとのマッチングに問題があることを検出すると、時間を節約しますが、プログラムを強制的に続行(またはパラメータの変更とペアの再試行)します。

ここでは、品質を落とさないことを望んでいないので、ここでは構成プロセスに改善の余地があるとは思いません。私があなたのことを研究しようとしているのは、多分スレッド化と並列コンピューティングが助けになるかどうかです。

これは面白い問題です。品質をあきらめることなく速度を上げることができれば、LGまたはGoogleに電話する必要があります.Nexusのアルゴリズムは本当に品質が悪いからです:)それは遅い不正確です

関連する問題