gpt4 book ai didi

c++ - 使用 C++ 的 OpenCV 库 - 详细说明 cv::Mat::at 在大图像上导致 SIGSEGV

转载 作者:行者123 更新时间:2023-11-28 03:38:22 24 4
gpt4 key购买 nike

我目前正在使用 openCV-lib(2.1 版)用 C++ 编写应用程序。任务是使用这个库的一些特性来实现一个小型数据库作为学生项目。我自己实现的中值滤波器和 boxcar 滤波器使用 cv::Mat::at 方法通过读取和写入操作访问给定图像中的单个像素。

奇怪的是:它在较小的图像上效果很好。但只有较大的图像,它总是生成一个 SIGSEGV,总是在相同的坐标上。

这是已知错误还是我真的做错了什么?

这是我写的最重要的功能:

class point {
public:
int x,y;
};

class ImageEntry {
friend class ImageDB;
private:
string _key;
string _filename;
Mat *_data;
ImageEntry* _next;
void show(void);
public:
void operator<<(ImageFilter* x);
~ImageEntry();
ImageEntry(string filename, string key);
Vec3b GetPoint(int x, int y);
point GetSize(void);
void SetPoint(int x, int y, Vec3b color);
};


point ImageEntry::GetSize(void) {
point iRet;
iRet.x = _data->cols;
iRet.y = _data->rows;
return iRet;
}

Vec3b ImageEntry::GetPoint(int x, int y) {
Vec3b iRet;
iRet = _data->at<Vec3b>(x,y);
return iRet;
}

void ImageEntry::SetPoint(int x, int y, Vec3b color) {
_data->at<Vec3b>(x,y) = color;
}

void MedianFilter::filterImage(ImageEntry* img) {
Vec3b Points[9];
Vec3b NewColor;

unsigned char ActChan[9];
point range = img->GetSize();
for (int act_x = 1; act_x < (range.x - 1); act_x++) {
for (int act_y = 1; act_y < range.y - 1; act_y++) {
Points[0] = img->GetPoint(act_x-1,act_y-1);
Points[1] = img->GetPoint(act_x,act_y-1);
Points[2] = img->GetPoint(act_x+1,act_y-1);
Points[3] = img->GetPoint(act_x-1,act_y);
Points[4] = img->GetPoint(act_x,act_y);
Points[5] = img->GetPoint(act_x+1,act_y);
Points[6] = img->GetPoint(act_x-1,act_y+1);
Points[7] = img->GetPoint(act_x,act_y+1);
Points[8] = img->GetPoint(act_x+1,act_y+1);

for (int act_color = 0; act_color < 3; act_color++) {
for (int i = 0; i < 9; i++) ActChan[i] = Points[i][act_color];
SelSort9(ActChan);
NewColor[act_color] = ActChan[4];
}
img->SetPoint(act_x,act_y,NewColor);
}
}
}

如果有任何建议,我将不胜感激。感谢您的宝贵时间!

最佳答案

如果您看一下您在 SetPoint() 方法中使用的函数 at(),在 documentation of OpenCv 中,它说:

template<typename _Tp> _Tp& Mat::at(int i, int j)

返回对指定矩阵元素的引用。参数:

i – The 0-based row index
j – The 0-based column index

此外,如果您查看 GetSize() 方法,您会设置 iRet.y = _data->rows 然后在方法 filterImage() 中使用 for循环从 act_y = 1 到 iRet.y 循环。第二个循环,遍历行。在此方法的末尾,您调用 SetPoint(act_x, act_y),它基本上又调用 at(act_x, act_y)

回想一下,act_y 是行的索引,但现在用作列的索引。我希望这个建议是您解决问题所需要的全部。

关于c++ - 使用 C++ 的 OpenCV 库 - 详细说明 cv::Mat::at 在大图像上导致 SIGSEGV,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10182236/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com