OpenCv - CvMouseCallback w pisanej przez siebie klasie

Odpowiedz Nowy wątek
2013-08-29 12:06
0

Od jakiegoś czasu uczę się biblioteki OpenCv do tej pory korzystałem z obsługi kliknięć myszką w poniższy sposób:

Do tej pory używałem w swoim programie

 void mouseEvent(int evt, int x, int y, int flags, void* param){
    if(evt==CV_EVENT_LBUTTONDOWN){
        printf("DOWN %d %d\n",x,y);
    }
    if(evt==CV_EVENT_LBUTTONUP){
        printf("UP %d %d\n",x,y);
    }
}

int MojaKlasa::Photo()
// Pobranie obrazu z Kamery 
{
      cvNamedWindow("MyWindow");

        //assigning the callback function for mouse events
        cvSetMouseCallback("MyWindow", mouseEvent, 0);

      .....
}

Jednakże w chwili obecnej potrzebowałbym żeby MojaKlasa zapamiętywała współrzędne punktu naciśnięcia myszki próbowałem to zrobić tak


public: 
int Down_x; 
int Down_y; 
void mouseEvent( int event, int x, int y, int flags, void* param );
void MojaKlasa::mouseEvent(int evt, int x, int y, int flags, void* param){
    if(evt==CV_EVENT_LBUTTONDOWN){
        printf("DOWN %d %d\n",x,y);
        Down_x = x;
        Down_y = y;
    }
    if(evt==CV_EVENT_LBUTTONUP){
        printf("UP %d %d\n",x,y);
    }
} 

Po dopisaniu poniższego kodu program nie kompiluje się, próbowałem go poprawiać ale za każdym razem coś jest nie tak. Prosiłbym o pomoc.


Nauka ASP MVC
"program nie kompiluje się", a wpisać jaki jest błąd kompilatora to nie łaska? - MarekR22 2013-08-29 12:25

Pozostało 580 znaków

2013-08-29 12:09
0

Ciężko określić, na jakiej podstawie robisz błąd, bo kod wygląda normalnie (chociaż styl kodu pozostawia wiele do życzenia ;) ). Może podeślij większy fragment kodu, bo z tego urywka nie da się nic wydedukować.


Znajdź mnie na Wykopie!

Nie jestem niczyim murzynem, żeby robić za Ciebie program. Nawet nie próbuj pisać na PW! :D
Nie wygląda normalnie. Wskaźnik na funkcje to nie jest to samo co wskaźnik na metodę. - _13th_Dragon 2013-08-29 12:38

Pozostało 580 znaków

2013-08-29 12:35
0

A ty błąd jaki się pojawia nie wstawiałem bo wiele razy starałem się poprawiać kod więc błędów było wiele różnych
error C3867: 'MojaKlasa::mouseEvent': function call missing argument list; use '&MojaKlasa::mouseEvent' to create a pointer to member
A tu fragment kodu biblioteki której używam

typedef void (CV_CDECL *CvMouseCallback )(int event, int x, int y, int flags, void* param);

/* assign callback for mouse events */
CVAPI(void) cvSetMouseCallback( const char* window_name, CvMouseCallback on_mouse,
                                void* param CV_DEFAULT(NULL));

Nauka ASP MVC
edytowany 1x, ostatnio: Robotyka, 2013-08-29 12:36

Pozostało 580 znaków

2013-08-29 12:36
1

dobra już widzę w czym problem.
W pieszym przypadku masz funkcję (tego oczekuje openCV): void mouseEvent(int evt, int x, int y, int flags, void* param)
W drugim przypadku masz METODĘ (nieformalnie funkcję z dodatkowym parametrem this na początku): void MojaKlasa::mouseEvent(int evt, int x, int y, int flags, void* param)

Rozwiązań tego problemu jest kilka. Ogólnie problemem jest tu openCV, które do pisania UI za bardzo się nie nadaje.

Najszybciej można to naprawić opakowując metodę funkcją, która będzie już strawna dla openCV.


Jeśli chcesz pomocy, NIE pisz na priva, ale zadaj dobre pytanie na forum.
edytowany 1x, ostatnio: MarekR22, 2013-08-29 12:37

Pozostało 580 znaków

2013-08-29 12:44
class MojaKlasa
  {
   ...
   static void mouseEventStat(int evt, int x, int y, int flags, void *param)
     {
      ((MojaKlasa*)param)->mouseEvent(evt,x,y,flags);
     }
   void mouseEvent(int evt, int x, int y, int flags)
     {
      if(evt==CV_EVENT_LBUTTONDOWN) {  printf("DOWN %d %d\n",x,y); }
      else if(evt==CV_EVENT_LBUTTONUP) { printf("UP %d %d\n",x,y); }
     }
   ...
  };

int MojaKlasa::Photo()
  {
   cvNamedWindow("MyWindow");
   cvSetMouseCallback("MyWindow",MojaKlasa::mouseEventStat,this);
    .....
  }

Wykonuję programy na zamówienie, pisać na Priv.
Asm/C/C++/Pascal/Delphi/Java/C#/PHP/JS oraz inne języki.
edytowany 6x, ostatnio: _13th_Dragon, 2013-08-29 13:21
brakuje przy rzutowaniu `((MojaKlasa)param)->...` :) - Japer 2013-08-29 12:48
Racja, umknęło. - _13th_Dragon 2013-08-29 13:21

Pozostało 580 znaków

Odpowiedz
Liczba odpowiedzi na stronę

1 użytkowników online, w tym zalogowanych: 0, gości: 1, botów: 0