2012-04-16 1 views
0

현재 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(), 살펴 경우

+0

"큰"크기와 항상 SIGSEGV를 생성하는 좌표는 무엇입니까? – molbdnilo

+0

이미지 크기는 850x649 픽셀입니다. SISGSEV는 x = 711 및 y = 8 (SetPoint 함수에서)에 나타납니다. 다른 이미지는 2244x626 픽셀입니다. 이미지의 경우 GetPoint에서 "at"의 x = 1144 및 y = 1 인 오류가 발생합니다. – TLuc

+0

복사 생성자 및 할당 연산자가 누락되었을 수 있습니다. – molbdnilo

답변

2

, 그것은 말한다 : 지정된 행렬 요소에

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

반환 참조. 매개 변수 : act_y = 1 to iRet.y에서 루프 루프 방법 filterImage() 사용 A의

당신이 당신의 getSize() 메소드를 보면
i – The 0-based row index 
j – The 0-based column index 

는 또한, 사용자가 설정 iRet.y = _data->rows 다음. 두 번째 루프는 행을 반복합니다. 이 방법이 끝나면 SetPoint(act_x, act_y)으로 전화를 걸고, 차례로 at(act_x, act_y)을 호출합니다.

act_y은 행의 인덱스 였지만 이제는 열의 인덱스로 사용됩니다. 나는이 제안이 당신이 당신의 문제를 해결하는 데 필요한 모든 것이되기를 바랍니다.

+0

오, 이런 .... 그 속임수를했습니다. 탱크에 아주 아주 많이! 가끔 2 + 2가 4라고 말할 누군가가 필요합니다 ... – TLuc