我目前正在与 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
更高的一列,我得到的代码223.442
。所以这两个结果在代码中的区别只有以下几点:
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;
};
打印的结果不仅取决于结构声明中列的位置,还取决于我更改代码的不同部分时。
这可能与双精度有关,但是如果我移动代码列,为什么它会改变?