저는 벡터의 벡터를 비교하여 비슷한 경우 병합하는 기능이 있습니다. 이미 병합 된 배열 요소의 인덱스를 기억해야하므로 큐에 저장합니다.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에서 시작하여 부호 INT (685)를 추가 따라 영역 1, 2, 3, 4, 5, 6 및 8은 다음 그것은 영역 (685)을 병합하고자과 충돌 병합 변수 r2에서 mergedIdxSet으로. 삽입을 건너 뛰면 region [r2]을 pointSet에 삽입 할 때 충돌이 발생합니다. 685 지역을 건너 뛰면 훨씬 다른 지역에서 충돌합니다. 왜 그런 일이 일어날까요?
미리 감사드립니다.
스택 추적을 공유 할 수 있습니까? – Sampath
[mcve]를 게시하여 코드에서 실제로 무엇이 일어나고 있는지 알려주십시오. 무엇이 잘못되었는지 이해하지 못하면 공유 할 수있는 부분이 무엇인지를 중요하게 생각하는 것은 좋은 생각이 아닙니다. 문제가 올바른 것으로 가정하는 코드 부분에 있기 때문입니다. – xaxxon
내기가 cv :: Mats 중 하나의 범위를 벗어난 액세스에 있습니다. –