2017-09-25 43 views
-2

私はベクトルのベクトルを比較し、それらが似ている場合にそれらをマージする関数を持っています。私はすでにマージされた配列要素のインデックスを覚えておく必要があるので、それらをキューに保存します。std :: set整数挿入のSegフォールト

いくつかのランダム要素では、インデックスをキューに挿入するとseg faultが発生します。私は本当に理由を知りません。ここに私のコードがある:アルゴリズムは領域0から始まり、領域1、2、3、4、5、6及び8をマージ

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"; 
    } 
} 

そしてそれはunsigned int型685を追加する際に領域685及びクラッシュをマージしたいです変数r2をmergedIdxSetに設定します。挿入点をスキップすると、region [r2]をpointSetに挿入しようとするとクラッシュします。リージョン685をスキップすると、後で他のリージョンでクラッシュします。なぜそれが起こるのですか?

ありがとうございます。

+0

スタックトレースを共有できますか? – Sampath

+1

あなたのコードで実際に何が起こっているのかを知るには、[mcve]を投稿してください。何がうまくいかないのか分からないときは、共有するのに十分な部分を選ぶのは良い考えではありません。あなたが正しいと思っているコードの部分に問題がある可能性が高いからです。 – xaxxon

+0

私の賭けは、cv :: Matsのいずれかの範囲外のアクセスにあります。 –

答えて

0

問題は、領域[r1]のベクターを上書きしようとしたことでした。どういうわけか、キューインサートでプログラム全体がクラッシュしました。私は非常に類似した地域を削除することで合併プロセスを置き換え、現在は機能しています。

ありがとうございます。

関連する問題