米倉です。

OpenCVではGUIライブラリがあり、Window上のマウス操作を受け取るのに以下の
ようします。

win = cvNamedWindow("window name", 0); // windowの作成
cvSetMouseCallback(win, on_mouse);
// win上でマウスの操作があったらon_mouseを呼び出す

void on_mouse(int event, int x, int y, int flags){
  //window上でのマウスのイベントを受け取る関数
  switch(event){
    case CV_EVENT_LBUTTONDOWN:
      ...
  }
}

これをRubyでWrapして

window = OpenCV::GUI::Window.new "window name", 0
window.set_mouse_callback{|event, x, y, flags|
   ...
}

のように書きたいと思うのですが、方法が思いつかず悩んでいます。

st_table *WindowClass::mousecallback = st_init_numtable();

VALUE WindowClass::setMouseCallback(int argc, VALUE *argv, VALUE self){
  VALUE block;
  rb_scan_args(argc, argv, "00&", &block);
  st_insert(mousecallback, (st_data_t)DATA_PTR(self),(st_data_t)block);
  cvSetMouseCallback(WINDOW(self), mouseCallback);
  return self;
}

void WindowClass::on_mouse(int event, int x, int y, int flags){
  st_data_t val;
  st_lookup(mousecallback, /* selfが分からない */, &val);
  rb_funcall((VALUE)val, rb_intern("call"), 4, INT2FIX(event), ...);
}

当初このようにしてProcオブジェクトを格納しておいて、on_mouseから呼び出そ
うと考えたのですが、on_mouse上で呼び出し元のwindowが分からないのでできま
せん。
どなたかよい方法を思いつきませんでしょうか。

-- 
--------------------------------------
 [ Kanagawa University ]
 Masakazu Yonekura
 mail: kazu / goto.info.kanagawa-u.ac.jp
--------------------------------------