stereo matching을 확인하면서, C source style은 track bar를 쉽게 사용할 수 있다.
하지만 C++ source style을 적용하면 문제 되는게 있다. 일단 아래의 source를 보자.
source 1 접기
////// /// /// /// /// /// /// .h /// /// /// /// /// /// /// /// /// /// /// ///
Class BM
{
BM(void);
CvStereoBMState *BMState;
void OnPreFilterCap(int pos);
void create_preFilterSize(char *name);
... 많은 함수들이 있겠지만, 생략한다.
}
////// /// /// /// /// /// /// .cpp or .c /// /// /// /// /// /// /// /// /// /// /// ///
void BM::create_preFilterSize(char *name)
{
char buf[_MAX_DIR];
sprintf(buf, name);
int preFilterSize = BMState->preFilterSize;
cvCreateTrackbar(buf, "setting", &preFilterSize, 255, OnPreFilterSize);
}
void BM::OnPreFilterSize(int pos)
{
}
접기
위와 같은 소스를 실행하면, error C3867: 'BM::OnPreFilterSize' : 함수 호출에 인수 목록이 없습니다. '&BM::OnPreFilterSize'을 사용하여 멤버에 대한 포인터를 만드십시오. 라는 error메세지가 나올것이다. 또한 cvCreateBrackbar에서 OnPreFilterSize의 형은 CvTrackbarCallback라는 것을 명심하자.
이에 해결 방법은 다음과 같이 선언하면 된다.
source 2 접기
/// /// /// /// /// /// /// /// .h /// /// /// /// /// /// /// /// /// /// /// ///
Class BM
{
BM(void);
CvStereoBMState *BMState;
void OnPreFilterCap(int pos);
static void __cdecl create_preFilterSize(char *name);
... 많은 함수들이 있겠지만, 생략한다.
}
접기 위의 source와 같이 추가하면, 위에 언급한 'error C3867'문제를 해결할 수 있다.
여기서, 추가적으로 OnPreFilterSize에서 class의 멤버 변수를 변경 할 수 없다.
여러가지 방법이 있겠지만, 내가 오늘 알게 된 것은 다음과 같다.
source 3 접기
/// /// /// /// /// /// /// /// .h /// /// /// /// /// /// /// /// /// /// /// ///
Class BM
{
BM(void);
CvStereoBMState *BMState;
static BM *currentObj;
void OnPreFilterCap(int pos);
static void __cdecl create_preFilterSize(char *name);
... 많은 함수들이 있겠지만, 생략한다.
}
////// /// /// /// /// /// /// .cpp or .c /// /// /// /// /// /// /// /// /// /// /// ///
BM* BM::currentObj = NULL; ///< initialize
BM::BM(void)
{
currentObj = this;
}
접기 위와 같이 추가적으로 선언해주면, static function에서도 멤버 변수를 변경 할 수 있다.
Tip 접기
* Tip
cvCreateTrackbar 처럼 5번째 변수에 static function 두번째 인자 이후일 경우는 제외하한다.
static function을 사용할 경우, 첫번째 인자를 class의 this를 넣어서 사용한다.
ex)
class BM
{
CvStereoBMState *BMState;
static void func(BM, int );
}
void BM::func(BM bm, int pos)
{
bm.BMState->preFilterSize = pos;
}
처럼 static 함수도 static 변수를 선언하지 않아도 access할 수 있다.
접기