2017-03-02 92 views
4

我正在研究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張圖像。

回答

0

由於55到18秒是一個相當不錯的改進,也許你可以控制匹配過程多一點。我首先會建議的是 - 如果你還沒有 - 學習調整過程的每一步,以瞭解什麼時候出現錯誤,當圖像不堅定。通過這種方式,您將始終學會控制例如您正在檢測的ORB功能的數量。也許有些情況下,你可以限制它們並仍然得到結果,從而加快這個過程(這不僅應該加速查找特徵,而且還要加快匹配過程)。

希望這會導致您能夠檢測到情況,何時 - 如您所說 - 循環休息。因此,你可以對此作出相應的反應。您仍然可以在循環中匹配序列,節省時間,但是當您檢測到匹配該特定對時存在問題時,強制程序繼續(或更改參數並嘗試再次匹配該對)。

我不認爲這裏的組成過程有很大的提升空間,因爲你不想失去質量。如果我是你,我會試圖研究的是如果線程和並行計算可能會有所幫助。

這是一個有趣和廣泛的問題 - 如果你能夠加速而不放棄質量,你應該打電話給LG或谷歌,因爲我在我的Nexus算法真的很差質量:)這是既緩慢又不準確的。