diff --git a/examples/contours.js b/examples/contours.js index bbaff3f..aaa971b 100755 --- a/examples/contours.js +++ b/examples/contours.js @@ -7,7 +7,7 @@ var maxArea = 2500; var GREEN = [0, 255, 0]; //B, G, R var WHITE = [255, 255, 255]; //B, G, R - +var RED = [0, 0, 255]; //B, G, R cv.readImage('./stuff.png', function(err, im) { @@ -24,7 +24,12 @@ cv.readImage('./stuff.png', function(err, im) { for(i = 0; i < contours.size(); i++) { if(contours.area(i) > maxArea) { + var moments = contours.moments(i); + var cgx = Math.round(moments.m10/moments.m00); + var cgy = Math.round(moments.m01/moments.m00); big.drawContour(contours, i, GREEN); + big.line([cgx - 5, cgy], [cgx + 5, cgy], RED); + big.line([cgx, cgy - 5], [cgx, cgy + 5], RED); } } diff --git a/src/Contours.cc b/src/Contours.cc index c586b3d..2193c23 100755 --- a/src/Contours.cc +++ b/src/Contours.cc @@ -33,6 +33,7 @@ Contour::Init(Handle target) { NODE_SET_PROTOTYPE_METHOD(constructor, "boundingRect", BoundingRect); NODE_SET_PROTOTYPE_METHOD(constructor, "minAreaRect", BoundingRect); NODE_SET_PROTOTYPE_METHOD(constructor, "isConvex", IsConvex); + NODE_SET_PROTOTYPE_METHOD(constructor, "moments", Moments); target->Set(String::NewSymbol("Contours"), m->GetFunction()); }; @@ -220,3 +221,24 @@ Contour::IsConvex(const Arguments &args) { return scope.Close(Boolean::New(isContourConvex(cv::Mat(self->contours[pos])))); } + +Handle +Contour::Moments(const Arguments &args) { + HandleScope scope; + + Contour *self = ObjectWrap::Unwrap(args.This()); + int pos = args[0]->NumberValue(); + + /// Get the moments + cv::Moments mu = moments( self->contours[pos], false ); + + Local res = Object::New(); + + res->Set(String::NewSymbol("m00"), Number::New(mu.m00)); + res->Set(String::NewSymbol("m10"), Number::New(mu.m10)); + res->Set(String::NewSymbol("m01"), Number::New(mu.m01)); + res->Set(String::NewSymbol("m11"), Number::New(mu.m11)); + + return scope.Close(res); +} + diff --git a/src/Contours.h b/src/Contours.h index c0f8879..e84c005 100755 --- a/src/Contours.h +++ b/src/Contours.h @@ -24,5 +24,6 @@ class Contour: public node::ObjectWrap { static Handle BoundingRect(const v8::Arguments&); static Handle MinAreaRect(const v8::Arguments&); static Handle IsConvex(const v8::Arguments&); + static Handle Moments(const v8::Arguments&); };