我有以下标题和函数定义;
blautil.hpp
namespace blautil{
...
cv::Mat compute_mean_mat(std::vector<cv::Mat> data, const int w, const int h);
...
}
blautil.cpp
namespace blautil{
...
cv::Mat compute_mean_mat(std::vector<cv::Mat> data, const int w, const int h){
cv::Mat Mean = cv::Mat::zeros(w, h, CV_32F);
for (int i = 1; i <= data.size(); i++){
cv::Mat image = data[i];
Mean += image;
}
Mean = Mean / data.size();
Mean.convertTo(Mean, CV_8U);
return Mean;
}
...
}
我在这里称呼它;
cv::Mat mean_img = blautils::compute_mean_mat(imageVector, width, height);
问题是在运行时这些宽度和高度值分别为25和45但是当代码进入函数体时,它们会变为不同的随机大值。
我在VS2013 Win8编码。从这些观察中,你会建议你诊断出那个有趣的问题?
编辑: 一旦我在一次编译之前和之后定义了w和h的默认值,我就删除了。之后发生了这个问题。同样的问题也出现在另一个函数中,我通过改变函数参数的顺序解决了它,但是现在它不能正常工作
答案 0 :(得分:2)
当参数被覆盖时,它可能意味着您正在写入堆栈的边界。我不知道它是否会导致实际问题,但您正在尝试访问无效的数据元素,因为我可以成为data.size()。循环应该是
for (int i = 1; i <= data.size(); i++){
...
}
要分析这个特定的问题,printf或cout i的值以及w和h的值,你应该能够看到它出错的地方。
答案 1 :(得分:0)
我看到的一个错误就是这个错误:
for (int i = 1; i <= data.size(); i++)
^^
{
cv::Mat image = data[i];
Mean += image;
}
应该是:
for (int i = 1; i < data.size(); i++)
更安全,你不会超出界限:
#include <algorithm>
//...
std::for_each(data.begin(), data.end(), [&](cv::Mat& m){Mean += m;});