moa*_*tta 6 c++ opencv image-processing
我目前正在与OpenCV/C++的一个非常奇怪的行为作斗争.这就是我在做的事情:
更新1:这里有更多信息:
我计算一组像素的梯度方向,并将它们存储在double自我声明的字段中struct.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);
}
Run Code Online (Sandbox Code Playgroud)
我后来有几个c存储在一个向量中,想要估计每个单独的平均值grad_orientation,存储在我的向量的每个struct-element中,如下所示:
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
}
Run Code Online (Sandbox Code Playgroud)
现在为有趣的部分:如果我在某些情况下这样做,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;
Run Code Online (Sandbox Code Playgroud)
};
打印结果不仅取决于结构声明中列的位置,还取决于我改变代码的不同部分.
这可能与双精度有关,但如果我移动代码列,为什么会改变?
好的,谢谢 Rolle 帮我解决了这个问题。我希望回答我自己的问题只是为了将其标记为已回答可以吗?
问题确实是在结构内部使用了未初始化的内存和布尔标志(在错误的决定之后)(当然,如果未初始化,则不是零)。事情是非常明显的,但事实是代码中的行交换(甚至在结构之外!)导致错误的(但不知何故非随机的)值让我有点困惑。
| 归档时间: |
|
| 查看次数: |
165 次 |
| 最近记录: |