2017-09-25 1 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에서 시작하여 부호 INT (685)를 추가 따라 영역 1, 2, 3, 4, 5, 6 및 8은 다음 그것은 영역 (685)을 병합하고자과 충돌 병합 변수 r2에서 mergedIdxSet으로. 삽입을 건너 뛰면 region [r2]을 pointSet에 삽입 할 때 충돌이 발생합니다. 685 지역을 건너 뛰면 훨씬 다른 지역에서 충돌합니다. 왜 그런 일이 일어날까요?

미리 감사드립니다.

+0

스택 추적을 공유 할 수 있습니까? – Sampath

+1

[mcve]를 게시하여 코드에서 실제로 무엇이 일어나고 있는지 알려주십시오. 무엇이 잘못되었는지 이해하지 못하면 공유 할 수있는 부분이 무엇인지를 중요하게 생각하는 것은 좋은 생각이 아닙니다. 문제가 올바른 것으로 가정하는 코드 부분에 있기 때문입니다. – xaxxon

+0

내기가 cv :: Mats 중 하나의 범위를 벗어난 액세스에 있습니다. –

답변

0

문제점은 [r1] 영역의 벡터를 덮어 쓰려고했습니다. 어떻게 든 그것이 전체 프로그램을 대기열 삽입에서 충돌하게 만들었습니다. 비슷한 영역을 삭제하여 병합 프로세스를 대체했으며 현재 작동합니다.

감사합니다.

관련 문제