如何使用 cv::setMouseCallback

Eng*_*ine 5 c++ opencv

我正在尝试在我的 C++ 项目中使用 cv::setMouseCallback。我只是不明白。让我成为一个班级 Stuff 如何告诉这个班级你有一个框架并在这个框架上运行 cv::setMouseCallback 这里是我正在尝试做的一个例子

 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 
    }
Run Code Online (Sandbox Code Playgroud)

这是得到的错误消息:

   Stuff::mouse : function call missing argument list; use '&Stuff::mouse ' to create a pointer to member 
Run Code Online (Sandbox Code Playgroud)

真正的程序太大了,不能把它的代码放在这里,为什么我试图简化这个问题

Cap*_*liC 3

您必须在类中将鼠标处理程序声明为静态。例如,我有一个dragger成员mouser,我想被称为。我声明一个 helper static void mouser,它投射收到的 void* 并调用该成员:

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);
}
Run Code Online (Sandbox Code Playgroud)

dragger以这种方式在构造函数中实例化

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

...
}
Run Code Online (Sandbox Code Playgroud)