0

私はのベクトルのベクトルを持っていますPoint(と呼ばれ、 (OpenCV)の関数squaresによって返されます)。findSquares()squares.cpp

Pointのベクトル(c ++言語)に格納されている4つのポイントのx座標とy座標の平均を実行したいと思います。

私はこれをやろうとしました:

    vector <Point> coordinates(4);

    for ( int i = 0; i<squares.size();i++) {

        coordinates[0].x += squares[i][0].x;
        coordinates[0].y += squares[i][0].y;

        coordinates[1].x += squares[i][1].x;
        coordinates[1].y += squares[i][1].y;

        coordinates[2].x += squares[i][2].x;
        coordinates[2].y += squares[i][2].y;

        coordinates[3].x += squares[i][3].x;
        coordinates[3].y += squares[i][3].y;
    } 
    if(squares.size() !=0){
        for( int j=0; j<4; j++) {
            coordinates[j].x /= squares.size();
            coordinates[j].y /= squares.size();
        }
    }

しかし、私はこの例外を受け取ります:

ここに画像の説明を入力してください

ポイントのベクトルのベクトルの要素を間違った方法で読んでいますか?

4

1 に答える 1

2

次のコードに注意してください。

if (squares.size() !=0){
    for( int j=0; j<4; j++) {
        coordinates[j].x /= squares.size();
        coordinates[j].y /= squares.size();
    }
}

このコードブロックは、が0より大きく4より小さいcoordinates[j].x場合にクラッシュする可能性があります。squares.size()

それが2だと想像してみてください。2になるとループsquares.size()で何が起こると思いますか?除算はになり、存在しないベクトル内の位置にアクセスしようとし、クラッシュを引き起こします。注意:配列のサイズが2の場合、ベクトルの有効なインデックスは0と1であるため、2は範囲外です。forjcoordinates[2].x /= squares.size();

これはコードの問題であり、クラッシュの原因である可能性があります。これを修正するには、ループを次のように更新します。

    for (int j = 0; j < squares.size(); j++) {

クラッシュが引き続き発生する場合、問題はコードの別の場所にあります。

于 2013-02-03T22:31:34.063 に答える