私はベクトルのベクトルを比較し、それらが似ている場合にそれらをマージする関数を持っています。私はすでにマージされた配列要素のインデックスを覚えておく必要があるので、それらをキューに保存します。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をスキップすると、後で他のリージョンでクラッシュします。なぜそれが起こるのですか?
ありがとうございます。
スタックトレースを共有できますか? – Sampath
あなたのコードで実際に何が起こっているのかを知るには、[mcve]を投稿してください。何がうまくいかないのか分からないときは、共有するのに十分な部分を選ぶのは良い考えではありません。あなたが正しいと思っているコードの部分に問題がある可能性が高いからです。 – xaxxon
私の賭けは、cv :: Matsのいずれかの範囲外のアクセスにあります。 –