私は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枚まで簡単にステッチすることができます。