diff --git a/binding.gyp b/binding.gyp index 0807aab..e664224 100755 --- a/binding.gyp +++ b/binding.gyp @@ -9,6 +9,7 @@ , "src/Contours.cc" , "src/Point.cc" , "src/VideoCaptureWrap.cc" + , "src/CamShift.cc" ] , 'libraries': [ ' TrackedObject::constructor; + +void +TrackedObject::Init(Handle target) { + HandleScope scope; + + // Constructor + constructor = Persistent::New(FunctionTemplate::New(TrackedObject::New)); + constructor->InstanceTemplate()->SetInternalFieldCount(1); + constructor->SetClassName(String::NewSymbol("TrackedObject")); + + // Prototype + //Local proto = constructor->PrototypeTemplate(); + + target->Set(String::NewSymbol("TrackedObject"), constructor->GetFunction()); +}; + + +Handle +TrackedObject::New(const Arguments &args) { + HandleScope scope; + + if (args.This()->InternalFieldCount() == 0) + return v8::ThrowException(v8::Exception::TypeError(v8::String::New("Cannot Instantiate without new"))); + + Matrix* m = ObjectWrap::Unwrap(args[0]->ToObject()); + cv::Rect r; + TrackedObject *to = new TrackedObject(m->mat, r); + to->Wrap(args.This()); + return args.This(); +} + + +TrackedObject::TrackedObject(cv::Mat image, cv::Rect rect){ +} + + +Handle +TrackedObject::Track(const v8::Arguments& args){ + SETUP_FUNCTION(TrackedObject) + + if (args.Length() != 1){ + v8::ThrowException(v8::Exception::TypeError(v8::String::New("track takes an image param"))); + return Undefined(); + } + + Matrix *im = ObjectWrap::Unwrap(args[0]->ToObject()); + + cv::RotatedRect r; + + r = cv::CamShift(self->prob, self->prev_rect, + cv::TermCriteria(CV_TERMCRIT_EPS | CV_TERMCRIT_ITER, 10, 1)); + + + return Undefined(); +} diff --git a/src/CamShift.h b/src/CamShift.h new file mode 100644 index 0000000..b8413ab --- /dev/null +++ b/src/CamShift.h @@ -0,0 +1,23 @@ +#include "OpenCV.h" + + +class TrackedObject: public node::ObjectWrap { + public: + cv::Mat hsv; + cv::Mat hue; + cv::Mat mask; + cv::Mat prob; + + //cv::Histogram* hist; + cv::Rect prev_rect; + // cv::Box2D curr_box; + + static Persistent constructor; + static void Init(Handle target); + static Handle New(const Arguments &args); + + TrackedObject(cv::Mat image, cv::Rect rect); + + JSFUNC(Track); + +}; diff --git a/test/unit.js b/test/unit.js index e03869d..3013469 100755 --- a/test/unit.js +++ b/test/unit.js @@ -257,6 +257,26 @@ vows.describe('Smoke Tests OpenCV').addBatch({ } + , "CamShift" : { + topic : require('../lib/opencv') + + , "create TrackedObject" : function(cv){ + var im = fs.readFileSync('./examples/mona.png') + , track = new cv.TrackedObject(im, [10,10, 50,50]); + + assert.ok(track); + } + + , "use TrackedObject.track" : function(cv){ + var im = fs.readFileSync('./examples/mona.png') + , im2 = fs.readFileSync('./examples/mona.png') + , tracked = new cv.TrackedObject(im, [10,10, 50,50]); + + assert.equal(tracked.track(im2), [10, 10, 50, 50]); + } + + } + }).export(module);