std :: set整数插入的段错误
问题描述:
我有一个函数比较向量中的向量,并在它们相似时将它们合并。我必须记住已经合并的数组元素的索引,所以我将它们保存在一个队列中。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区域,它会在很久以后崩溃在其他区域。为什么会发生?
在此先感谢。
答
问题是我试图覆盖区域[r1]中的矢量。不知何故,导致整个程序崩溃在队列插入。我通过删除非常相似的区域取代了合并过程,现在它可以工作。
感谢您的意见。
你能分享堆栈跟踪吗? – Sampath
请发表[mcve],以便我们可以知道您的代码中实际发生了什么。当你不明白发生了什么问题时,选择哪些部分足够重要以便共享并不是一个好主意,因为问题可能出在您认为是正确的部分代码中。 – xaxxon
我的赌注是在cv :: Mats之一上出界。 –