Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

how to use cv::setMouseCallback

Tags:

c++

opencv

I'm trying to use cv::setMouseCallback in my c++ project. I just don't get it. let that I habe a class Stuff how can tell this class you got a frame and run the cv::setMouseCallback on this frame here is an example of what I'm trying to do :

 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 
    }

this the error message that get:

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

the real program is too big to put its code here that why I'm trying to simplify the question

like image 528
Engine Avatar asked Oct 06 '22 09:10

Engine


1 Answers

you must declare a mouse handler as static inside your class. For instance, I have a dragger with a member mouser, that I want to be called. I declare an helper static void mouser, that cast the void* received and calls the member:

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

and instance in dragger constructor in this way

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

...
}
like image 187
CapelliC Avatar answered Oct 10 '22 13:10

CapelliC