From 81aaeedb40281e09d7a9b56e137f3c2ad1ebc2d5 Mon Sep 17 00:00:00 2001 From: Salman Date: Sun, 20 Apr 2014 23:20:20 +0500 Subject: [PATCH 1/3] updated binding.gyp to add BackgroundSubtractor --- binding.gyp | 1 + 1 file changed, 1 insertion(+) diff --git a/binding.gyp b/binding.gyp index 406d74a..72df9f3 100755 --- a/binding.gyp +++ b/binding.gyp @@ -12,6 +12,7 @@ , "src/CamShift.cc" , "src/HighGUI.cc" , "src/FaceRecognizer.cc" + , "src/BackgroundSubtractor.cc" ] , 'libraries': [ ' Date: Sun, 20 Apr 2014 23:20:46 +0500 Subject: [PATCH 2/3] BackgroundSubtractor added --- src/BackgroundSubtractor.cc | 135 ++++++++++++++++++++++++++++++++++++ src/BackgroundSubtractor.h | 21 ++++++ 2 files changed, 156 insertions(+) create mode 100644 src/BackgroundSubtractor.cc create mode 100644 src/BackgroundSubtractor.h diff --git a/src/BackgroundSubtractor.cc b/src/BackgroundSubtractor.cc new file mode 100644 index 0000000..476f663 --- /dev/null +++ b/src/BackgroundSubtractor.cc @@ -0,0 +1,135 @@ +#include "BackgroundSubtractor.h" +#include "Matrix.h" +#include + +Persistent BackgroundSubtractorWrap::constructor; + +void +BackgroundSubtractorWrap::Init(Handle target) { + HandleScope scope; + + // Constructor + constructor = Persistent::New(FunctionTemplate::New(BackgroundSubtractorWrap::New)); + constructor->InstanceTemplate()->SetInternalFieldCount(1); + constructor->SetClassName(String::NewSymbol("BackgroundSubtractor")); + + NODE_SET_METHOD(constructor, "createMOG", CreateMOG); + NODE_SET_PROTOTYPE_METHOD(constructor, "applyMOG", ApplyMOG); + + target->Set(String::NewSymbol("BackgroundSubtractor"), constructor->GetFunction()); +}; + +Handle +BackgroundSubtractorWrap::New(const Arguments &args) { + HandleScope scope; + + if (args.This()->InternalFieldCount() == 0) + JSTHROW_TYPE("Cannot Instantiate without new") + + //Create MOG by default + cv::Ptr bg = cv::createBackgroundSubtractorMOG(200, 5, 0.7, 0); + BackgroundSubtractorWrap *pt = new BackgroundSubtractorWrap(bg); + + pt->Wrap(args.This()); + + return args.This(); +} + +Handle +BackgroundSubtractorWrap::CreateMOG(const Arguments &args) { + HandleScope scope; + + int history = 200; + int nmixtures = 5; + double backgroundRatio = 0.7; + double noiseSigma = 0; + + if(args.Length() > 1){ + INT_FROM_ARGS(history, 0) + INT_FROM_ARGS(nmixtures, 1) + DOUBLE_FROM_ARGS(backgroundRatio, 2) + DOUBLE_FROM_ARGS(noiseSigma, 3) + } + + Local n = BackgroundSubtractorWrap::constructor->GetFunction()->NewInstance(); + + cv::Ptr bg = cv::createBackgroundSubtractorMOG( + history, nmixtures, backgroundRatio, noiseSigma + ); + BackgroundSubtractorWrap *pt = new BackgroundSubtractorWrap(bg); + + pt->Wrap(n); + return n; +}; + +//Fetch foreground mask +Handle +BackgroundSubtractorWrap::ApplyMOG(const Arguments &args) { + + SETUP_FUNCTION(BackgroundSubtractorWrap) + + REQ_FUN_ARG(1, cb); + + Local argv[2]; + + if(args.Length() == 0){ + argv[0] = String::New("Input image missing"); + argv[1] = Local::New(Null()); + cb->Call(Context::GetCurrent()->Global(), 2, argv); + return scope.Close(Undefined()); + } + + try{ + + Local fgMask = Matrix::constructor->GetFunction()->NewInstance(); + Matrix *img = ObjectWrap::Unwrap(fgMask); + + + cv::Mat mat; + + if(Buffer::HasInstance(args[0])){ + uint8_t *buf = (uint8_t *) Buffer::Data(args[0]->ToObject()); + unsigned len = Buffer::Length(args[0]->ToObject()); + cv::Mat *mbuf = new cv::Mat(len, 1, CV_64FC1, buf); + mat = cv::imdecode(*mbuf, -1); + //mbuf->release(); + } + else{ + Matrix *_img = ObjectWrap::Unwrap(args[0]->ToObject()); + mat = (_img->mat).clone(); + } + + if (mat.empty()){ + return v8::ThrowException(v8::Exception::TypeError(v8::String::New("Error loading file"))); + } + + cv::Mat _fgMask; + self->subtractor->apply(mat, _fgMask); + + img->mat = _fgMask; + + mat.release(); + + argv[0] = Local::New(Null()); + argv[1] = fgMask; + + TryCatch try_catch; + + cb->Call(Context::GetCurrent()->Global(), 2, argv); + + if (try_catch.HasCaught()) { + FatalException(try_catch); + } + + return scope.Close(v8::Undefined()); + } + catch( cv::Exception& e ){ + const char* err_msg = e.what(); + return v8::ThrowException(v8::Exception::Error(v8::String::New(err_msg))); + } + +}; + +BackgroundSubtractorWrap::BackgroundSubtractorWrap(cv::Ptr _subtractor){ + subtractor = _subtractor; +}; \ No newline at end of file diff --git a/src/BackgroundSubtractor.h b/src/BackgroundSubtractor.h new file mode 100644 index 0000000..001967b --- /dev/null +++ b/src/BackgroundSubtractor.h @@ -0,0 +1,21 @@ +#include "OpenCV.h" + +#if CV_MAJOR_VERSION >= 2 && CV_MINOR_VERSION >=4 + +#include + +class BackgroundSubtractorWrap: public node::ObjectWrap { + public: + cv::Ptr subtractor; + + static Persistent constructor; + static void Init(Handle target); + static Handle New(const Arguments &args); + + BackgroundSubtractorWrap(cv::Ptr bg); + + static Handle CreateMOG(const v8::Arguments&); + static Handle ApplyMOG(const v8::Arguments&); +}; + +#endif \ No newline at end of file From 35e93db3948e1fabfbe7d4e2a782092448791ed5 Mon Sep 17 00:00:00 2001 From: Salman Date: Mon, 21 Apr 2014 23:01:55 +0500 Subject: [PATCH 3/3] updated BackgroundSubtractor.cc, builds fine now. --- src/BackgroundSubtractor.cc | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/BackgroundSubtractor.cc b/src/BackgroundSubtractor.cc index 476f663..86ea9f4 100644 --- a/src/BackgroundSubtractor.cc +++ b/src/BackgroundSubtractor.cc @@ -2,6 +2,8 @@ #include "Matrix.h" #include +#if CV_MAJOR_VERSION >= 2 && CV_MINOR_VERSION >=4 + Persistent BackgroundSubtractorWrap::constructor; void @@ -132,4 +134,6 @@ BackgroundSubtractorWrap::ApplyMOG(const Arguments &args) { BackgroundSubtractorWrap::BackgroundSubtractorWrap(cv::Ptr _subtractor){ subtractor = _subtractor; -}; \ No newline at end of file +}; + +#endif \ No newline at end of file