ext/spyglass/background_subtractor.cc in spyglass-0.0.3 vs ext/spyglass/background_subtractor.cc in spyglass-0.0.4

- old
+ new

@@ -1,52 +1,107 @@ #include "background_subtractor.h" -static VALUE BackgroundSubtractorClass; +static VALUE BackgroundSubtractorModule; +static VALUE BGSMOGClass; +static VALUE BGSMOG2Class; +static VALUE BGSGMGClass; +static VALUE BGSPratiMediodClass; namespace Spyglass { namespace BackgroundSubtractor { - void define_ruby_class() { - // Class definition - BackgroundSubtractorClass = rb_define_class_under(Spyglass::get_ruby_module(), "BackgroundSubtractor", rb_cObject); - rb_define_alloc_func(BackgroundSubtractorClass, rb_alloc); - rb_define_method(BackgroundSubtractorClass, "initialize", RUBY_METHOD_FUNC(rb_initialize), -1); + void define_ruby_types() { + // Module definition + BackgroundSubtractorModule = rb_define_module_under(Spyglass::get_ruby_module(), "BackgroundSubtractor"); - // Instance methods - rb_define_method(BackgroundSubtractorClass, "subtract", RUBY_METHOD_FUNC(rb_subtract), -1); + // Class definition: MOG + BGSMOGClass = rb_define_class_under(BackgroundSubtractorModule, "MOG", rb_cObject); + rb_define_alloc_func(BGSMOGClass, rb_mog_alloc); + rb_define_method(BGSMOGClass, "initialize", RUBY_METHOD_FUNC(rb_initialize), -1); + rb_define_method(BGSMOGClass, "subtract", RUBY_METHOD_FUNC(rb_subtract), -1); + + // Class definition: MOG2 + BGSMOG2Class = rb_define_class_under(BackgroundSubtractorModule, "MOG2", rb_cObject); + rb_define_alloc_func(BGSMOG2Class, rb_mog2_alloc); + rb_define_method(BGSMOG2Class, "initialize", RUBY_METHOD_FUNC(rb_initialize), -1); + rb_define_method(BGSMOG2Class, "subtract", RUBY_METHOD_FUNC(rb_subtract), -1); + + // Class definition: GMG + BGSGMGClass = rb_define_class_under(BackgroundSubtractorModule, "GMG", rb_cObject); + rb_define_alloc_func(BGSGMGClass, rb_gmg_alloc); + rb_define_method(BGSGMGClass, "initialize", RUBY_METHOD_FUNC(rb_initialize), -1); + rb_define_method(BGSGMGClass, "subtract", RUBY_METHOD_FUNC(rb_subtract), -1); + + // Class definition: PratiMediod + BGSPratiMediodClass = rb_define_class_under(BackgroundSubtractorModule, "PratiMediod", rb_cObject); + rb_define_alloc_func(BGSPratiMediodClass, rb_prati_mediod_alloc); + rb_define_method(BGSPratiMediodClass, "initialize", RUBY_METHOD_FUNC(rb_initialize), -1); + rb_define_method(BGSPratiMediodClass, "subtract", RUBY_METHOD_FUNC(rb_subtract), -1); } - VALUE get_ruby_class() { - return BackgroundSubtractorClass; + VALUE get_ruby_module() { + return BackgroundSubtractorModule; } - static VALUE rb_alloc(VALUE self) { - cv::BackgroundSubtractorMOG2 *bg = new cv::BackgroundSubtractorMOG2(); - return Data_Wrap_Struct(BackgroundSubtractorClass, NULL, rb_free, bg); + static VALUE rb_mog_alloc(VALUE self) { + cv::BackgroundSubtractor *bg = new cv::BackgroundSubtractorMOG(); + return Data_Wrap_Struct(BGSMOGClass, NULL, rb_free, bg); } - static void rb_free(cv::BackgroundSubtractorMOG2 *bg) { - bg->~BackgroundSubtractorMOG2(); + static VALUE rb_mog2_alloc(VALUE self) { + cv::BackgroundSubtractor *bg = new cv::BackgroundSubtractorMOG2(); + return Data_Wrap_Struct(BGSMOG2Class, NULL, rb_free, bg); + } + + static VALUE rb_gmg_alloc(VALUE self) { + cv::BackgroundSubtractor *bg = new cv::BackgroundSubtractorGMG(); + return Data_Wrap_Struct(BGSGMGClass, NULL, rb_free, bg); + } + + static VALUE rb_prati_mediod_alloc(VALUE self) { + cv::BackgroundSubtractor *bg = new DPPratiMediodBGS(); + return Data_Wrap_Struct(BGSPratiMediodClass, NULL, rb_free, bg); + } + + static void rb_free(cv::BackgroundSubtractor *bg) { delete bg; } static VALUE rb_initialize(int argc, VALUE *argv, VALUE self) { VALUE opts; rb_scan_args(argc, argv, "01", &opts); if(!RTEST(opts)) return self; - cv::BackgroundSubtractorMOG2 *bg = SG_GET_BG_SUBTRACTOR(self); + cv::BackgroundSubtractor *bg = SG_GET_BG_SUBTRACTOR(self); - SG_OPTION(opts, int, history, 500, NUM2INT); - SG_OPTION(opts, double, threshold, 8.0, NUM2DBL); - SG_OPTION(opts, bool, shadow_detection, true, RTEST); + if(CLASS_OF(self) == BGSMOGClass) { + SG_OPTION(opts, int, history, 200, NUM2INT); + SG_OPTION(opts, int, mixtures, 5, NUM2INT); + SG_OPTION(opts, double, background_ratio, 0.7, NUM2DBL); - bg->set("history", history); - bg->set("varThreshold", threshold); - bg->set("detectShadows", shadow_detection); + bg->set("history", history); + bg->set("nmixtures", mixtures); + bg->set("backgroundRatio", background_ratio); + } else if(CLASS_OF(self) == BGSMOG2Class) { + SG_OPTION(opts, int, history, 500, NUM2INT); + SG_OPTION(opts, double, threshold, 8.0, NUM2DBL); + SG_OPTION(opts, bool, shadow_detection, true, RTEST); + bg->set("history", history); + bg->set("varThreshold", threshold); + bg->set("detectShadows", shadow_detection); + } else if(CLASS_OF(self) == BGSPratiMediodClass) { + SG_OPTION(opts, int, history, 16, NUM2INT); + SG_OPTION(opts, int, threshold, 30, NUM2INT); + SG_OPTION(opts, int, sampling_rate, 5, NUM2INT); + + bg->set("historySize", history); + bg->set("threshold", threshold); + bg->set("samplingRate", sampling_rate); + } + return self; } static VALUE rb_subtract(int argc, VALUE *argv, VALUE self) { VALUE image, learn_rate; @@ -59,16 +114,16 @@ rb_obj_classname(image)); } if(RTEST(learn_rate) && TYPE(learn_rate) != T_FLOAT && TYPE(learn_rate) != T_FIXNUM) - rb_raise(rb_eTypeError, "wrong argument type %s (expected Float or Fixnum)", - rb_obj_classname(learn_rate)); + rb_raise(rb_eTypeError, "wrong argument type %s (expected Float or Fixnum)", + rb_obj_classname(learn_rate)); rate = RTEST(learn_rate) ? NUM2DBL(learn_rate) : -1.0; - cv::BackgroundSubtractorMOG2 *bg = SG_GET_BG_SUBTRACTOR(self); - cv::Mat *img = SG_GET_IMAGE(image); + cv::BackgroundSubtractor *bg = SG_GET_BG_SUBTRACTOR(self); + cv::Mat *img = SG_GET_IMAGE(image); cv::Mat *delta = new cv::Mat(); (*bg)(*img, *delta, rate); return Image::from_cvmat(delta);