현재 openCV-lib (버전 2.1)을 사용하여 C++로 응용 프로그램을 작성하고 있습니다. 작업은이 라이브러리의 일부 기능을 사용하여 학생용 프로젝트로 작은 데이터베이스를 구현하는 것이 었습니다. 내 자신의 median-filter 및 boxcar-filter 구현은 cv :: Mat :: at 메서드를 사용하여 읽기 및 쓰기 작업 모두에서 주어진 이미지의 단일 픽셀에 액세스합니다.OpenCV lib with C++ - 상세 정보 cv :: Mat :: at는 큰 이미지에서 SIGSEGV를 발생시킵니다.
궁금한 점은 다음과 같습니다. 더 작은 이미지에서 완벽하게 작동합니다. 그러나 더 큰 이미지 만 항상 같은 좌표에서 SIGSEGV를 생성합니다.
이것은 알려진 버그입니까? 아니면 정말로 잘못된 것입니까?
여기에 내가 쓴 가장 significants 기능은 다음과 같습니다
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);
}
}
}
내가 어떤 제안을 정말 감사하겠습니다. 시간 내 주셔서 감사합니다. 당신이 documentation of OpenCv, 당신은 설정 값() 메소드에서 사용하는 기능 at()
, 살펴 경우
"큰"크기와 항상 SIGSEGV를 생성하는 좌표는 무엇입니까? – molbdnilo
이미지 크기는 850x649 픽셀입니다. SISGSEV는 x = 711 및 y = 8 (SetPoint 함수에서)에 나타납니다. 다른 이미지는 2244x626 픽셀입니다. 이미지의 경우 GetPoint에서 "at"의 x = 1144 및 y = 1 인 오류가 발생합니다. – TLuc
복사 생성자 및 할당 연산자가 누락되었을 수 있습니다. – molbdnilo