OpenCv - CvMouseCallback w pisanej przez siebie klasie

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.

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ć.

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));
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.

1
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);
    .....
  }

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