2013-07-11 2 views
5

제목에서 알 수 있듯이 OpenCV의 mouseCallback 함수를 C++ 기반 클래스에서 구현하는 데 문제가 있습니다. 설명 할 수있게 해줘. 나는 BriskMatching이라는 클래스를 정의했다.이 클래스에서 OpenCV가 요구하는 올바른 매개 변수를 사용하여 mouseCallback이라는 멤버 함수를 만들었습니다 (아래의 코드 스 니펫을 참조하십시오). OpenCV의 mouseCallback 함수의 클래스 기반 구현을 만드는 데 문제가 있습니다.

**Briskmatching.h** 

class BriskMatching 
{ 
public: 
    BriskMatching(); 
    ~BriskMatching(); 

public: 
    void mouseCallback(int event, int x, int y, int flags, void *param); 
}; 

내가 OpenCV의의 cv::setMouseCallback 기능을 통해 지정된 마우스 콜백 기능으로이 기능을 설정하려고하면 그러나 내 문제가 발생, 모두 괜찮습니다. 내 주요 기능에

, 나는 그것이 내가 지금처럼 그것을 시도 마우스 콜백을 설정하는 시간을 ... 때 다음

cv::setMouseCallback("Matches", BriskMatching::mouseCallback, &matchesImg); 

불행하게도,이 발생 briskMatcher라는 BriskMatching 클래스의 인스턴스를 생성 오류.

Error 3 error C3867: 'BriskMatching::mouseCallback': function call missing argument list; use '&BriskMatching::mouseCallback' to create a pointer to member c:\users\mobilef\documents\visual studio 2010\projects\opencv_objtracking\opencv_briskmatching\main.cpp 54 1 OpenCV_BriskMatching 

나는 내가 mouseCallback 기능에 많은 비 정적 멤버 변수를 참조하기 때문에 내가 다른 오류의 전체 구타를 얻을 수 staticBriskMatching.h에 있지만 다음과 같이 mouseCallback 기능을 선언하여이 오류를 제거 할 수있다.

제 질문은 여러분에게 있습니다. BriskMatching 클래스 내에서 선언 된 내 mouseCallback 함수를 cv::setMouseCallback 함수로 제대로 전달할 수 있도록 코드를 수정해야합니까?

전진 해 주셔서 감사합니다.

답변

12

멤버 함수는 this 포인터를 사용하므로 정적 래퍼 함수가 필요합니다. 일반적으로 멤버 함수가 속한 개체의 주소가되도록 param 매개 변수를 사용하기 때문에이 같은 끝낼 다음 mouseCallback 내부에 다음

... 
static void mouseCallback(int event, int x, int y, int flags, void *param); 

void doMouseCallback(int event, int x, int y, int flags); 

그리고 :

void BriskMatching::mouseCallback(int event, int x, int y, int flags, void *param) 
{ 
    BriskMatching *self = static_cast<BriskMatching*>(param); 
    self->doMouseCallback(event, x, y, flags); 
} 
+0

감사합니다. 그것은 훌륭하게 작동하지만, 그것의 논리 또는 작동 원리를 완전히 이해하지 못합니다. 저는 C++로 몇 년 동안 코딩을 해왔습니다.하지만 항상 타입 캐스트를 피 했으므로 항상 저에게 회색 영역이었습니다. 나는 지금 그들에게 읽어주기 위해 가서이 모든 것이 어떻게 작동하는지 이해하려고 노력할 것입니다. – szakeri

0

나는이 방법을 사용하고 있었지만, 정적 도우미 클래스가 상당히 딱딱하고 타입과 메쏘드가 얽혀 있다는 것을 깨달았다. 내가 보이는 템플릿 무료 기능을 정의한 그냥 더 참조

같은 :

template<typename TClass, void (TClass::*MouseClickType)(int, int, int, int)> 
void FreeOnMouseCallback(int event, int x, int y, int flags, void* ptr) 
{ 
    auto* mcPtr = static_cast<TClass*>(ptr); 
    if(mcPtr != NULL) 
    { 
     (mcPtr->*MouseClickType)(event, x, y, flags); 
    } 
} 

그리고 지금

와 클래스 내부의 임의의 기능 (서명 일치가 아니라 이름)을 호출 할 수 있습니다
cv::setMouseCallback(WindowName, FreeOnMouseCallback<Calibrator, &Calibrator::OnMouseCallback>, this); 

void * ptr도 필요하면 확장 될 수 있지만 여기서 생략했습니다.

관련 문제