2013-01-11 4 views
3

내 C++ 프로젝트에서 cv :: setMouseCallback을 사용하려고합니다. 나는 단지 그것을 얻지 않는다.cv :: setMouseCallback 사용 방법

class Stuff{ 
public: 
Stuff(); 
void setFrame(cv::Mat); 
void mouse (int,int, int, int,void*); 
    private : 
cv::Mat frame; 
int key; 
}; 

Stuff::Stuff(){} 

void Stuff::setFrame(cv::Mat framex){ 
frame = framex; 
} 


    int main(){ 
Stuff obj; 

cv::Mat frame = cv::imread ("examople.jpg"); 
char* name; 
cv::imshow(name,frame); 
cv::setMouseCallback(name,obj.mouse,&frame) // I' stop here because that's exactlly what just don't work 
    } 

이 : 난 당신이 프레임을 가지고이 클래스를 말하고 여기이 프레임에 이력서 :: setMouseCallback을 실행할 수있는 클래스 물건을 habe 하자 내가 할 노력하고있어의 입니다 오류 메시지가 얻을 :

Stuff::mouse : function call missing argument list; use '&Stuff::mouse ' to create a pointer to member 

실제 프로그램은 내가 질문 모든

+1

포스트 컴파일러 오류 메시지에 dragger 생성자

class dragger { void mouser(int event, int x, int y) { current_img = original_img.clone(); Point P(x, y); ... } static void mouser(int event, int x, int y, int, void* this_) { static_cast<dragger*>(this_)->mouser(event, x, y); } 

및 인스턴스하십시오 : 나는 무효가 *받은 캐스트 멤버를 호출하는 도우미 static void mouser를 선언합니다. – user1284631

+0

@axeoth 내가 그랬어, 난 질문을 편집했습니다 – Engine

답변

2

클래스 내에서 마우스 처리기를 정적으로 선언해야합니다. 예를 들어, 나는 이라는 회원이있는 dragger을 가지고 있는데, 나는 그 전화를 받고 싶습니다.이 방법

dragger(string w, Mat m) : 
    window_id(w), status(0), original_img(m), /*black(0, 0, 0),*/ K(5, 5) 
{ 
    ... 
    setMouseCallback(w, mouser, this); 
} 

... 
} 
1

첫째을 단순화하기 위해 노력하고있어 왜 당신이에서 명명 된 창을 만들 필요가 여기에 해당 코드를 넣어 너무 큰 main 기능. namedWindow("image", 0); 또는 이와 유사한 것이 작업을 수행합니다.

마우스 콜백 함수는 frame 변수와 연결되어 있지 않지만 해당 변수는 윈도우에 연결되어 있습니다. 귀하의 경우에는 다음과 같습니다 :

char* name = "image"; 
cv::namedWindow(name, 0); 
cv::setMousCallback(name, obj.mouse,&frame); 

콜백은 창에서 이벤트가 발생할 때 다른 기능을 호출하는 기능입니다. 마우스의 경우 이벤트는 마우스 움직임, 왼쪽, 오른쪽 또는 중간 클릭 일 수 있습니다. Here 당신은 좋은 설명뿐만 아니라 그 (것)들의 명부를 찾아 낼 수있다.

따라서이 "이벤트"가 창에서 발생하면 opencv는 setMouseCallback에 지정된 이름의 함수를 인수로 사용합니다 (사용자의 경우 Stuff::mouse). 이 같은 함수를 정의하는 경우 :

는 이벤트 변수는 만약 이미지 등 에 마우스 해제 위치와 트리거의 값 x와 y로 가득 할 것이다라고
Stuff::mouse(int event, int x, int y, int flags, void* params) 

당신은 patxiska의 답변의 수정을 고려하면 this 질문에 사용하는 마우스 기능에서 프레임을 통과하고 싶습니다.

switch(event){ 
    case CV_EVENT_LBUTTONDOWN: 
     //... 
     break; 

    case CV_EVENT_RBUTTONDOWN: 
     //... 
     break; 

    case CV_EVENT_FLAG_CTRLKEY: 
     //... 
     break; 
} 

을하고 다시 cv::Matvoid*에서를 타입 캐스팅하여 프레임을 촬영 :

그래서 스위치 당신은 그것이 이벤트의 종류를 확인할 수 있습니다.

Here 마우스 콜백을 사용하는 방법에 대한 Opencv 사이트의 또 다른 예를 찾을 수 있습니다.

희망이있어, 잠시 동안 opencv를 사용하지 않아서 샘플 소스 파일이 없습니다. 콜백은 Opencv GUI에서 단순화되었지만 모든 GUI 작업의 논리입니다. 마우스 및 키보드 트리거 이벤트 및 콜백 함수와 같은 입력은 구현의 기능에 이벤트를 전달합니다.

+0

많은 도움을 주셔서 감사하지만 이건 내 문제를 해결하지 내 질문 편집을 참조하십시오, 난 그냥 컴파일러 오류를 추가했습니다 – Engine

관련 문제