OpenCv - CvMouseCallback w pisanej przez siebie klasie

OpenCv - CvMouseCallback w pisanej przez siebie klasie
RO
  • Rejestracja:ponad 17 lat
  • Ostatnio:około 2 lata
  • Lokalizacja:Warszawa
  • Postów:75
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

Kopiuj
 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

Kopiuj
 
public:	
int Down_x; 
int Down_y; 
void mouseEvent( int event, int x, int y, int flags, void* param );
Kopiuj
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.


Poszukiwanie narzędzia do tworzenia instalatora
MarekR22
"program nie kompiluje się", a wpisać jaki jest błąd kompilatora to nie łaska?
Japer
  • Rejestracja:prawie 14 lat
  • Ostatnio:około 11 lat
  • Postów:47
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
_13th_Dragon
Nie wygląda normalnie. Wskaźnik na funkcje to nie jest to samo co wskaźnik na metodę.
RO
  • Rejestracja:ponad 17 lat
  • Ostatnio:około 2 lata
  • Lokalizacja:Warszawa
  • Postów:75
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

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

Poszukiwanie narzędzia do tworzenia instalatora
edytowany 1x, ostatnio: Robotyka
MarekR22
Moderator C/C++
  • Rejestracja:ponad 17 lat
  • Ostatnio:mniej niż minuta
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
_13th_Dragon
  • Rejestracja:ponad 19 lat
  • Ostatnio:5 dni
1
Kopiuj
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
Japer
brakuje * przy rzutowaniu ((MojaKlasa*)param)->... :)
_13th_Dragon
Racja, umknęło.

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.