私は現在、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;
};
印刷される結果は、構造体宣言内の列の位置だけでなく、コードのさまざまな部分を変更した場合にも依存します。
これは倍精度と関係があるかもしれませんが、コードの列を移動するとなぜ変更されるのですか?