From b17fceca72176afa596743055d495d185abd34c7 Mon Sep 17 00:00:00 2001 From: Peter Braden Date: Wed, 13 Mar 2013 16:15:29 -0700 Subject: [PATCH] Initial work on face recognition using the FaceRecognizer class from opencv 2.4.4 --- binding.gyp | 1 + smoke/smoketest.js | 7 +++++- src/FaceRecognizer.cc | 52 +++++++++++++++++++++++++++++++++++++++++++ src/FaceRecognizer.h | 28 +++++++++++++++++++++++ src/init.cc | 7 +++++- 5 files changed, 93 insertions(+), 2 deletions(-) create mode 100644 src/FaceRecognizer.cc create mode 100644 src/FaceRecognizer.h diff --git a/binding.gyp b/binding.gyp index dd37c53..c4053a1 100755 --- a/binding.gyp +++ b/binding.gyp @@ -11,6 +11,7 @@ , "src/VideoCaptureWrap.cc" , "src/CamShift.cc" , "src/HighGUI.cc" + , "src/FaceRecognizer.cc" ] , 'libraries': [ '= 2 && CV_MINOR_VERSION >=4 + +#include "Matrix.h" + +void AsyncPredict(uv_work_t *req); +void AfterAsyncPredict(uv_work_t *req); + +Persistent FaceRecognizerWrap::constructor; + +void +FaceRecognizerWrap::Init(Handle target) { + HandleScope scope; + + // Constructor + constructor = Persistent::New(FunctionTemplate::New(FaceRecognizerWrap::New)); + constructor->InstanceTemplate()->SetInternalFieldCount(1); + constructor->SetClassName(String::NewSymbol("FaceRecognizer")); + + NODE_SET_PROTOTYPE_METHOD(constructor, "train", Train); + + + target->Set(String::NewSymbol("FaceRecognizer"), constructor->GetFunction()); +}; + +Handle +FaceRecognizerWrap::New(const Arguments &args) { + HandleScope scope; + + if (args.This()->InternalFieldCount() == 0) + return v8::ThrowException(v8::Exception::TypeError(v8::String::New("Cannot Instantiate without new"))); + + + // By default initialize eigenface + cv::FaceRecognizer *f = cv::createEigenFaceRecognizer(); + FaceRecognizerWrap *pt = new FaceRecognizerWrap(f); + + pt->Wrap(args.This()); + return args.This(); +} + +FaceRecognizerWrap::FaceRecognizerWrap(cv::FaceRecognizer* f){ +} + +Handle +FaceRecognizerWrap::Train(const Arguments& args){ + SETUP_FUNCTION(Matrix) + +} +#endif // End version > 2.4 diff --git a/src/FaceRecognizer.h b/src/FaceRecognizer.h new file mode 100644 index 0000000..17df540 --- /dev/null +++ b/src/FaceRecognizer.h @@ -0,0 +1,28 @@ +#include "OpenCV.h" + +#if CV_MAJOR_VERSION >= 2 && CV_MINOR_VERSION >=4 + +#include "opencv2/contrib/contrib.hpp" + +class FaceRecognizerWrap: public node::ObjectWrap { + public: + cv::FaceRecognizer* rec; + + static Persistent constructor; + static void Init(Handle target); + static Handle New(const Arguments &args); + + FaceRecognizerWrap(cv::FaceRecognizer* f); + + JSFUNC(Train) + JSFUNC(Update) + + JSFUNC(Predict) + static void EIO_Predict(eio_req *req); + static int EIO_AfterPredict(eio_req *req); + +}; + + + +#endif diff --git a/src/init.cc b/src/init.cc index 063d984..1610800 100755 --- a/src/init.cc +++ b/src/init.cc @@ -6,6 +6,7 @@ #include "Contours.h" #include "CamShift.h" #include "HighGUI.h" +#include "FaceRecognizer.h" extern "C" void @@ -18,8 +19,12 @@ init(Handle target) { VideoCaptureWrap::Init(target); Contour::Init(target); TrackedObject::Init(target); - NamedWindow::Init(target); + + #if CV_MAJOR_VERSION >= 2 && CV_MINOR_VERSION >=4 + FaceRecognizerWrap::Init(target); + #endif + }; NODE_MODULE(opencv, init)