我对C ++很新,所以我真的不知道出了什么问题。我在这里有一个函数来获取orignal_image并使其成为一个油页。 https://www.codeproject.com/Articles/471994/OilPaintEffect 我按照这些步骤操作,但仍然遇到分段错误。
cv::Mat getFilteredImage(const cv::Mat &original_image,
int radius,
int levels)
{
for(int i=0;i<original_image.rows;i++)
{
for(int j=0;j<original_image.cols;j++)
{
for(int k=-radius;k<=radius;k++)
{
for(int l=-radius;l<=radius;l++)
{
int IB = original_image.at<cv::Vec3b>(j,i)[0];
int IG = original_image.at<cv::Vec3b>(j,i)[1];
int IR = original_image.at<cv::Vec3b>(j,i)[2];
int intervall = floor(((double)((IR+IG+IB)/3.0) * (levels/255.0)));//eine Pixel intensität errechen
if(intervall>255)
{
intervall = 255;
}
std::vector<int> intensityCount;
intensityCount[intervall]++;
int averageB[intervall];
int averageG[intervall];
int averageR[intervall];
averageB[intervall] += IB;
averageG[intervall] += IG;
averageR[intervall] += IR;
}
}
int Curmax=0;
int maxIndex;
for(int nI = 0; nI<256;nI++)
{
if(intensityCount[nI]>Curmax) //this is not allowed
{
Curmax = intensityCount[nI];
maxIndex = nI;
}
}
}
}
cv::Mat output = cv::Mat::zeros(original_image.size(),
original_image.type());
return output;
}
答案 0 :(得分:1)
std::vector<int> intensityCount;
intensityCount[intervall]++;
这并不能解决你的问题。第一行声明并初始化空向量。这意味着您的第二行将访问未初始化的内存,这是您的段错误的原因。要解决此问题,请使用给定尺寸(std::vector<int>
intensityCount(yourSizeHere)
)初始化矢量或使用push back或emplace back。