-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區域,它會在很久以後崩潰在其他區域。爲什麼會發生?
在此先感謝。
你能分享堆棧跟蹤嗎? – Sampath
請發表[mcve],以便我們可以知道您的代碼中實際發生了什麼。當你不明白髮生了什麼問題時,選擇哪些部分足夠重要以便共享並不是一個好主意,因爲問題可能出在您認爲是正確的部分代碼中。 – xaxxon
我的賭注是在cv :: Mats之一上出界。 –