diff --git a/binding.gyp b/binding.gyp index 97ccd40..8cd66bf 100755 --- a/binding.gyp +++ b/binding.gyp @@ -19,7 +19,8 @@ "src/Constants.cc", "src/Calib3D.cc", "src/ImgProc.cc", - "src/Stereo.cc" + "src/Stereo.cc", + "src/LDAWrap.cc" ], "libraries": [ diff --git a/src/LDAWrap.cc b/src/LDAWrap.cc new file mode 100644 index 0000000..34d4e17 --- /dev/null +++ b/src/LDAWrap.cc @@ -0,0 +1,94 @@ +#include "LDAWrap.h" +#include "OpenCV.h" + +#if ((CV_MAJOR_VERSION >= 2) && (CV_MINOR_VERSION >=4) && (CV_SUBMINOR_VERSION>=4)) + +#include "Matrix.h" +#include + +Nan::Persistent LDAWrap::constructor; + +void LDAWrap::Init(Local target) { + Nan::HandleScope scope; + + // Constructor + Local ctor = Nan::New(LDAWrap::New); + constructor.Reset(ctor); + ctor->InstanceTemplate()->SetInternalFieldCount(1); + ctor->SetClassName(Nan::New("LDA").ToLocalChecked()); + + Nan::SetPrototypeMethod(ctor, "subspaceProject", SubspaceProject); + Nan::SetPrototypeMethod(ctor, "subspaceReconstruct", SubspaceReconstruct); + + target->Set(Nan::New("LDA").ToLocalChecked(), ctor->GetFunction()); +}; + +NAN_METHOD(LDAWrap::New) { + Nan::HandleScope scope; + + if (info.This()->InternalFieldCount() == 0) { + JSTHROW_TYPE("Cannot Instantiate without new") + } + + LDAWrap *pt = new LDAWrap(); + + pt->Wrap(info.This()); + info.GetReturnValue().Set(info.This()); +} + +LDAWrap::LDAWrap() { +} + +/** + * http://docs.opencv.org/master/db/d59/classcv_1_1LDA.html#a69c7019a344edc5c55799c16a9fc9ada + */ +NAN_METHOD(LDAWrap::SubspaceProject) { + if (info.Length() != 3) { + JSTHROW("SubspaceProject function requires 3 arguments") + } + + // param 0 - eigenvectors + Matrix *w = Nan::ObjectWrap::Unwrap(info[0]->ToObject()); + + // param 1 - mean + Matrix *mean = Nan::ObjectWrap::Unwrap(info[1]->ToObject()); + + // param 2 - src + Matrix *src = Nan::ObjectWrap::Unwrap(info[2]->ToObject()); + + cv::Mat m = cv::subspaceProject(w->mat, mean->mat, src->mat); + + Local im = Nan::New(Matrix::constructor)->GetFunction()->NewInstance(); + Matrix *img = Nan::ObjectWrap::Unwrap(im); + img->mat = m; + + info.GetReturnValue().Set(im); +} + +/** + * http://docs.opencv.org/master/db/d59/classcv_1_1LDA.html#acbf9949e7567e23af5f71c29fcef76d4 + */ +NAN_METHOD(LDAWrap::SubspaceReconstruct) { + if (info.Length() != 3) { + JSTHROW("SubspaceReconstruct function requires 3 arguments") + } + + // param 0 - eigenvectors + Matrix *w = Nan::ObjectWrap::Unwrap(info[0]->ToObject()); + + // param 1 - mean + Matrix *mean = Nan::ObjectWrap::Unwrap(info[1]->ToObject()); + + // param 2 - src + Matrix *src = Nan::ObjectWrap::Unwrap(info[2]->ToObject()); + + cv::Mat m = cv::subspaceReconstruct(w->mat, mean->mat, src->mat); + + Local im = Nan::New(Matrix::constructor)->GetFunction()->NewInstance(); + Matrix *img = Nan::ObjectWrap::Unwrap(im); + img->mat = m; + + info.GetReturnValue().Set(im); +} + +#endif // End version > 2.4 diff --git a/src/LDAWrap.h b/src/LDAWrap.h new file mode 100644 index 0000000..2c47cba --- /dev/null +++ b/src/LDAWrap.h @@ -0,0 +1,19 @@ +#include "OpenCV.h" + +#if ((CV_MAJOR_VERSION >= 2) && (CV_MINOR_VERSION >=4)) + +#include "opencv2/contrib/contrib.hpp" + +class LDAWrap: public Nan::ObjectWrap { +public: + static Nan::Persistent constructor; + static void Init(Local target); + static NAN_METHOD(New); + + LDAWrap(); + + JSFUNC(SubspaceProject) + JSFUNC(SubspaceReconstruct) +}; + +#endif diff --git a/src/init.cc b/src/init.cc index 44a7c3b..a3af3be 100755 --- a/src/init.cc +++ b/src/init.cc @@ -14,6 +14,7 @@ #include "ImgProc.h" #include "Stereo.h" #include "BackgroundSubtractor.h" +#include "LDAWrap.h" extern "C" void init(Local target) { Nan::HandleScope scope; @@ -37,6 +38,7 @@ extern "C" void init(Local target) { BackgroundSubtractorWrap::Init(target); Features::Init(target); FaceRecognizerWrap::Init(target); + LDAWrap::Init(target); #endif };