2017-09-25 83 views
-2

我有一個函數比較向量中的向量,並在它們相似時將它們合併。我必須記住已經合併的數組元素的索引,所以我將它們保存在一個隊列中。std :: set整數插入的段錯誤

在某些隨機元素上,索引插入隊列會產生seg錯誤。我真的不明白爲什麼。這是我的代碼:

using namespace cv; 
using namespace std; 
//... 
//... 
unordered_set<uint> mergedIdxSet = unordered_set<uint>(); 
mergedIdxSet.reserve(regions.size()); 
//... 
//... 
cout << "Test region " << r1 << " (" << regions[r1].size() << ") with...\n"; 
for(uint r2 = r1+1; r2 < regions.size(); r2++) 
{ 
    if((bBoxes[r1] & bBoxes[r2]).area() == 0) 
    { 
     continue; 
    } 

    cout << "\tRegion " << r2 << "\n"; 

    Rect unionBound = bBoxes[r1] | bBoxes[r2]; 
    Point upperLeftBound = Point(unionBound.x, unionBound.y); 
    Mat interMap = Mat::zeros(unionBound.size(), CV_8UC1); 
    for(uint p = 0; p < regions[r1].size(); p++) 
    { 
     interMap.at<uchar>(regions[r1][p]-upperLeftBound) = 128; 
    } 
    for(uint p = 0; p < regions[r2].size(); p++) 
    { 
     interMap.at<uchar>(regions[r2][p]-upperLeftBound) += 127; 
    } 
    int intersectionArea = countNonZero(interMap); 
    if(intersectionArea/regions[r1].size() >= ratio || 
     intersectionArea/regions[r2].size() >= ratio) 
    { 
     cout << "\t\tMerge\n"; 
     mergedIdxSet.insert(r2); 
     for(uint i = 0; i < regions[r2].size(); i++) 
     { 
      pointSet.insert(regions[r2][i]); 
     } 
     regions[r1] = vector<Point>(pointSet.begin(), pointSet.end()); 
     cout << "New length: " << regions[r1].size() << "\n"; 
    } 
} 

該算法開始於區域0和在添加的無符號整型685匯合的區域1,2,3,4,5,6和8。然後它要合併區域685和崩潰在變量r2中變爲mergedIdxSet。如果我只是跳過插入,當試圖將區域[r2]插入到pointSet時會崩潰。如果我跳過685區域,它會在很久以後崩潰在其他區域。爲什麼會發生?

在此先感謝。

+0

你能分享堆棧跟蹤嗎? – Sampath

+1

請發表[mcve],以便我們可以知道您的代碼中實際發生了什麼。當你不明白髮生了什麼問題時,選擇哪些部分足夠重要以便共享並不是一個好主意,因爲問題可能出在您認爲是正確的部分代碼中。 – xaxxon

+0

我的賭注是在cv :: Mats之一上出界。 –

回答

0

問題是我試圖覆蓋區域[r1]中的矢量。不知何故,導致整個程序崩潰在隊列插入。我通過刪除非常相似的區域取代了合併過程,現在它可以工作。

感謝您的意見。