diff --git a/smoke/smoketest.js b/smoke/smoketest.js index 36b1077..d8ed244 100755 --- a/smoke/smoketest.js +++ b/smoke/smoketest.js @@ -8,55 +8,18 @@ for (var i = 1; i< 41; i++){ } } -var facerec = new cv.FaceRecognizer(); -facerec.train(trainingData); +cv.readImage("/Users/peterbraden/Downloads/orl_faces/s6/10.pgm", function(e, im){ -console.log(facerec.predictSync('/Users/peterbraden/Downloads/orl_faces/s6/10.pgm')); + var facerec = cv.FaceRecognizer.createFisherFaceRecognizer(); + facerec.train(trainingData); + console.log(facerec.predictSync(im)); -/* -var win = new cv.NamedWindow("foo"); -cv.readImage('./examples/stuff.png', function(e, im){ - im.pyrDown(); - win.show(im); - console.log(win.blockingWaitKey(0), "!!") - win.destroy(); - -}) -*/ - - -/* -new cv.VideoCapture(0).read(function(mat){ - - mat.resize(200,100) - mat.save('./out.jpg') - - mat.detectObject("./data/haarcascade_frontalface_alt.xml", {min : [30,30]}, function(err, faces){ - for (var i=0;i target) { constructor = Persistent::New(FunctionTemplate::New(FaceRecognizerWrap::New)); constructor->InstanceTemplate()->SetInternalFieldCount(1); constructor->SetClassName(String::NewSymbol("FaceRecognizer")); - + + NODE_SET_METHOD(constructor, "createLBPHFaceRecognizer", CreateLBPH); + NODE_SET_METHOD(constructor, "createEigenFaceRecognizer", CreateEigen); + NODE_SET_METHOD(constructor, "createFisherFaceRecognizer", CreateFisher); + NODE_SET_PROTOTYPE_METHOD(constructor, "train", Train); NODE_SET_PROTOTYPE_METHOD(constructor, "predictSync", PredictSync); target->Set(String::NewSymbol("FaceRecognizer"), constructor->GetFunction()); -}; +}; Handle FaceRecognizerWrap::New(const Arguments &args) { @@ -57,6 +61,76 @@ FaceRecognizerWrap::New(const Arguments &args) { return args.This(); } +Handle +FaceRecognizerWrap::CreateLBPH(const Arguments &args) { + HandleScope scope; + + int radius = 1; + int neighbors = 8; + int grid_x = 8; + int grid_y = 8; + double threshold = 80; + + INT_FROM_ARGS(radius, 0) + INT_FROM_ARGS(neighbors, 1) + INT_FROM_ARGS(grid_x, 2) + INT_FROM_ARGS(grid_y, 3) + DOUBLE_FROM_ARGS(threshold, 4) + + Local n = FaceRecognizerWrap::constructor->GetFunction()->NewInstance(); + + cv::Ptr f = cv::createLBPHFaceRecognizer( + radius, neighbors, grid_x, grid_y, threshold + ); + FaceRecognizerWrap *pt = new FaceRecognizerWrap(f); + + pt->Wrap(n); + return n; +} + +Handle +FaceRecognizerWrap::CreateEigen(const Arguments &args) { + HandleScope scope; + + int components = 0; + double threshold = DBL_MAX; + + INT_FROM_ARGS(components, 0) + DOUBLE_FROM_ARGS(threshold, 1) + + Local n = FaceRecognizerWrap::constructor->GetFunction()->NewInstance(); + + cv::Ptr f = cv::createEigenFaceRecognizer( + components, threshold + ); + FaceRecognizerWrap *pt = new FaceRecognizerWrap(f); + + pt->Wrap(n); + return n; +} + +Handle +FaceRecognizerWrap::CreateFisher(const Arguments &args) { + HandleScope scope; + + int components = 0; + double threshold = DBL_MAX; + + INT_FROM_ARGS(components, 0) + DOUBLE_FROM_ARGS(threshold, 1) + + Local n = FaceRecognizerWrap::constructor->GetFunction()->NewInstance(); + + cv::Ptr f = cv::createFisherFaceRecognizer( + components, threshold + ); + FaceRecognizerWrap *pt = new FaceRecognizerWrap(f); + + pt->Wrap(n); + return n; +} + + FaceRecognizerWrap::FaceRecognizerWrap(cv::Ptr f){ rec = f; } diff --git a/src/FaceRecognizer.h b/src/FaceRecognizer.h index 0eacd65..8cc45f0 100644 --- a/src/FaceRecognizer.h +++ b/src/FaceRecognizer.h @@ -14,6 +14,10 @@ class FaceRecognizerWrap: public node::ObjectWrap { FaceRecognizerWrap(cv::Ptr f); + JSFUNC(CreateLBPH) + JSFUNC(CreateEigen) + JSFUNC(CreateFisher) + JSFUNC(Train) JSFUNC(Update) diff --git a/src/OpenCV.h b/src/OpenCV.h index 9b5bfe7..1233033 100755 --- a/src/OpenCV.h +++ b/src/OpenCV.h @@ -33,6 +33,17 @@ using namespace node; #define JSTHROW(ERR) \ return v8::ThrowException(v8::Exception::Error(v8::String::New(ERR))); + +#define INT_FROM_ARGS(NAME, IND) \ + if (args[IND]->IsInt32()){ \ + NAME = args[IND]->Uint32Value(); \ + } + +#define DOUBLE_FROM_ARGS(NAME, IND) \ + if (args[IND]->IsInt32()){ \ + NAME = args[IND]->NumberValue(); \ + } + class OpenCV: public node::ObjectWrap{ public: static void Init(Handle target);