2011-07-21 15 views
8

Obowiązkowe - Jestem nowicjuszem. Miej pracę, która wymaga programowania i uczę się jak idę. Nie trzeba dodawać, że jako nauczyciel, często i źle się czuję.OpenCV 2.3 z VS 2008 - zdarzenia myszy

Gdzie jestem teraz: stworzyłem klasę "Wykres", to (co zaskakujące) tworzy wykresy. Ale teraz chcę sprawić, aby po kliknięciu myszki zmodyfikowałem wykres. Ale wydaje mi się, że nie mogę obsłużyć obsługi myszy, aby być członkiem tej klasy.

cv::setMouseCallback(windowName, onMouse, 0); // Set mouse handler to be onMouse 

nie działa z

cv::setMouseCallback(windowName, Graph::onMouse, 0); 

Daje mi brak błędów parametrów. Według this nie mogę sprawić, by była funkcją członka. Po wykonaniu podanej odpowiedzi kompiluje się, ale mój wskaźnik jest zerowany. Ugh.

OnMouse wygląda następująco:

void onMouse(int event, int x, int y,int, void*) 
{ 
    if (event == CV_EVENT_LBUTTONDOWN) 
    { 
     cvMoveWindow("Window", 500, 500); //Just to see if stuff happened 
    } 
    return; 
} 

Nie dbam o przesunięcie okna, chcę zmodyfikować sam wykres - która jest przechowywana jako zmienna cv :: Mat w obiekcie Graph. I nie mogę wymyślić, jak to zrobić.

Każda pomoc zostanie doceniona i mam nadzieję, że to nie był tylko bełkot.

+0

ładne pytanie! Mam dokładnie ten sam problem. –

Odpowiedz

11

Tak funkcje wywołania zwrotnego w C++ są radością, prawda? Właściwie musisz dać OpenCV funkcję (nie jest to metoda klasy), jak już wiesz. Jednak można siekać wokół tej potworności stosując następujące techniki:

class MyClass 
{ 
public: 
    void realOnMouse(int event, int x, int y, int flags) 
    { 
     // Do your real processing here, "this" works fine. 
    } 
}; 

// This is a function, not a class method 
void wrappedOnMouse(int event, int x, int y, int flags, void* ptr) 
{ 
    MyClass* mcPtr = (MyClass*)ptr; 
    if(mcPtr != NULL) 
     mcPtr->realOnMouse(event, x, y, flags); 
} 

int main(int argv, char** argc) 
{ 
    // OpenCV setup stuff... 

    MyClass processor; 
    cv::setMouseCallback(windowName, wrappedOnMouse, (void*)&processor); 

    // Main program logic 

    return 0; 
} 

Ten ostatni parametr na setMouseCallback jest bardzo przydatne dla przezwyciężenia niektórych problemów, które zwykle napotykają tak.

+0

Awesome! Dziękuję Ci. Ponieważ wywołuję funkcję SetMouseCallback z funkcji członka wykresu, zmieniłem procesor na "ten" i działa doskonale. – Russbear

+0

czy możliwe jest oddzielenie wywołania funkcji mouseCallback od wywołującego, tzn. SetMouseCallback, aby być częścią klasy, a nie w programie głównym? Myślę, że wygodniej jest sprawić, by klasa miała funkcję myszy. możliwy?? Dzięki! –

1

Można również użyć metody onMouse jako metody statycznej.

class Graph 
{ 
public: 
    static void onMouse(int event, int x, int y, void* param) 
    { 
      //Your code here 
    } 

    //Everything else you may need 
} 

Teraz powinieneś być w stanie wywołać metodę onMouse z:

cv::setMouseCallback(windowName, onMouse, (void*) param); 

param może być NULL lub cokolwiek chcesz przekazać jako parametr do metody, ale trzeba zrobić rzut typu do pożądanego typu.

Mam nadzieję, że to było przydatne. Pa.

Powiązane problemy