6

私は現在、OpenCV /C++の非常に奇妙な振る舞いで戦っています。これは私がしていることです:

更新1:ここでより多くの情報:

一連のピクセルのグラデーションの向きを計算しdouble、自己宣言されたのフィールドに保存しますstruct。構造体要素はベクトルに格納されます。

myfunct1() {
    (...)
    c.grad_orientation = (sum_ori / highgrads.size()) + M_PI; // +M_PI because i just  want to rotate the angle around 180°.
    (...)
    my_struct_vector.push_back(c);
}

後でいくつかをベクトルに格納し、ベクトルのすべての構造体要素に格納されているcすべての単一の平均を次のように推定したいと思います。grad_orientation

myfunct0() {
    myfunct1(); //adds element to the my_struct_vector
    (...)
    int n = 0;
    double total_ori = 0.0;
    for (uint i = 0; i < my_struct_vector.size(); ++i) {
        total_ori += my_struct_vector[i].grad_orientation;
        n++;
    }

    azimuth = (total_ori / n);
    cout << "Average: " << azimuth * 180/M_PI << endl; // print out in degrees
}

面白い部分です。特定の状況でこれを行うと、cout印刷され215.963ます。これは私が最も頻繁に得た結果です(まさにこの結果)。場合によっては、上記の名前のこれらの行列を追加した場合、または(はい、実際に)grad_orientation構造体のを保持しているダブルフィールドをコードの観点から1列上に移動した場合に取得し223.442ます。したがって、コードの2つの結果の違いは次のとおりです。

struct my_struct {

std::vector<cv::Point> contour_shadow;
std::vector<cv::Point> contour_light;
cv::RotatedRect rect;
cv::Point pf; 
cv::Point pc;
double grad_orientation; // this line moved one column down, beneath "grad_flag" results in a differing result.
bool grad_flag;
double grad_magnitude;

};

印刷される結果は、構造体宣言内の列の位置だけでなく、コードのさまざまな部分を変更した場合にも依存します。

これは倍精度と関係があるかもしれませんが、コードの列を移動するとなぜ変更されるのですか?

4

1 に答える 1

0

さて、これについて私を助けてくれたRolleに感謝します。自分の質問に答えたとマークするだけで大​​丈夫だと思いますか?
問題は、実際には、初期化されていないメモリと、構造体内のブールフラグ(後で間違った決定)を使用していたことでした(もちろん、初期化されていない場合はゼロではありません)。非常に明白なことですが、コード内の行の交換(構造体の外でも!)が間違った(しかしどういうわけかランダムではない)値につながったという事実は、私を混乱させました。

ここを参照してくださいC++構造体のメンバーはデフォルトで0に初期化されていますか?

于 2012-11-14T10:36:17.017 に答える