我正在研究Visual Studio 2012,C++中的多重圖像拼接。我根據我的要求修改了stitching_detailed.cpp,並提供了高質量的結果。這裏的問題是,執行需要太多時間。對於10張圖片,大約需要110秒。如何優化多個圖像拼接?
這裏就是花費大多數時間:
1)成對匹配 - 花費10張55秒!我使用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張圖片拼接獲得(最後4個被排除在外,因爲像6和7的圖像特徵點在某種程度上不匹配,並且因此該循環中斷。)
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
當我應用於機器人此代碼的其餘部分,它需要智能電話的幾乎整個存儲器(RAM)執行。如何減少Android設備的時間和內存消耗? (我使用的Android設備有2 GB RAM)
我已經優化了其餘的代碼。任何幫助深表感謝!
編輯1:我在合成步驟中使用圖像壓縮,時間從38秒減少到16秒。我還設法縮短了其他代碼的時間。
所以現在,從110 - > 85秒。幫助我縮短成對匹配的時間;我不知道如何減少它!
編輯2:我發現在matchers.cpp成對匹配的代碼。我在主代碼中創建了自己的函數來優化時間。對於合成步驟,我使用了壓縮,直到最終圖像不失去清晰度。對於特徵查找,我使用圖像縮放來縮小圖像比例以查找圖像特徵。現在我可以輕鬆縫製50張圖像。