Skip to content
Browse files

Merge pull request #34 from mintplant/contours

Contours expansion: minAreaRect and convexHull bindings, expose underlying point data
  • Loading branch information...
2 parents e64b558 + 84e5f25 commit bb1fa037f3d54b0e84825c482adba1d51d299853 @peterbraden committed
Showing with 79 additions and 0 deletions.
  1. +76 −0 src/Contours.cc
  2. +3 −0 src/Contours.h
View
76 src/Contours.cc
@@ -23,12 +23,15 @@ Contour::Init(Handle<Object> target) {
//Local<ObjectTemplate> proto = constructor->PrototypeTemplate();
+ NODE_SET_PROTOTYPE_METHOD(constructor, "point", Point);
NODE_SET_PROTOTYPE_METHOD(constructor, "size", Size);
NODE_SET_PROTOTYPE_METHOD(constructor, "cornerCount", CornerCount);
NODE_SET_PROTOTYPE_METHOD(constructor, "area", Area);
NODE_SET_PROTOTYPE_METHOD(constructor, "arcLength", ArcLength);
NODE_SET_PROTOTYPE_METHOD(constructor, "approxPolyDP", ApproxPolyDP);
+ NODE_SET_PROTOTYPE_METHOD(constructor, "convexHull", ConvexHull);
NODE_SET_PROTOTYPE_METHOD(constructor, "boundingRect", BoundingRect);
+ NODE_SET_PROTOTYPE_METHOD(constructor, "minAreaRect", BoundingRect);
NODE_SET_PROTOTYPE_METHOD(constructor, "isConvex", IsConvex);
target->Set(String::NewSymbol("Contours"), m->GetFunction());
};
@@ -53,6 +56,23 @@ Contour::Contour(): ObjectWrap() {
}
+Handle<Value>
+Contour::Point(const Arguments &args) {
+ HandleScope scope;
+
+ Contour *self = ObjectWrap::Unwrap<Contour>(args.This());
+ int pos = args[0]->NumberValue();
+ int index = args[1]->NumberValue();
+
+ cv::Point point = self->contours[pos][index];
+
+ Local<Object> data = Object::New();
+ data->Set(String::NewSymbol("x"), Number::New(point.x));
+ data->Set(String::NewSymbol("y"), Number::New(point.y));
+
+ return scope.Close(data);
+}
+
// FIXME: this sould better be called "Length" as ``Contours`` is an Array like structure
// also, this would allow to use ``Size`` for the function returning the number of corners
// in the contour for better consistency with OpenCV.
@@ -117,6 +137,23 @@ Contour::ApproxPolyDP(const Arguments &args) {
Handle<Value>
+Contour::ConvexHull(const Arguments &args) {
+ HandleScope scope;
+
+ Contour *self = ObjectWrap::Unwrap<Contour>(args.This());
+
+ int pos = args[0]->NumberValue();
+ bool clockwise = args[1]->BooleanValue();
+
+ cv::Mat hull;
+ cv::convexHull(cv::Mat(self->contours[pos]), hull, clockwise);
+ hull.copyTo(self->contours[pos]);
+
+ return scope.Close(v8::Null());
+}
+
+
+Handle<Value>
Contour::BoundingRect(const Arguments &args) {
HandleScope scope;
@@ -136,6 +173,45 @@ Contour::BoundingRect(const Arguments &args) {
Handle<Value>
+Contour::MinAreaRect(const Arguments &args) {
+ HandleScope scope;
+
+ Contour *self = ObjectWrap::Unwrap<Contour>(args.This());
+ int pos = args[0]->NumberValue();
+
+ cv::RotatedRect minimum = cv::minAreaRect(cv::Mat(self->contours[pos]));
+
+ Local<Object> rect = Object::New();
+ rect->Set(String::NewSymbol("angle"), Number::New(minimum.angle));
+
+ Local<Object> size = Object::New();
+ size->Set(String::NewSymbol("height"), Number::New(minimum.size.height));
+ size->Set(String::NewSymbol("width"), Number::New(minimum.size.width));
+ rect->Set(String::NewSymbol("size"), size);
+
+ Local<Object> center = Object::New();
+ center->Set(String::NewSymbol("x"), Number::New(minimum.center.x));
+ center->Set(String::NewSymbol("y"), Number::New(minimum.center.y));
+
+ v8::Local<v8::Array> points = v8::Array::New(4);
+
+ cv::Point2f rect_points[4];
+ minimum.points(rect_points);
+
+ for (unsigned int i=0; i<4; i++){
+ Local<Object> point = Object::New();
+ point->Set(String::NewSymbol("x"), Number::New(rect_points[i].x));
+ point->Set(String::NewSymbol("y"), Number::New(rect_points[i].y));
+ points->Set(i, point);
+ }
+
+ rect->Set(String::NewSymbol("points"), points);
+
+ return scope.Close(rect);
+}
+
+
+Handle<Value>
Contour::IsConvex(const Arguments &args) {
HandleScope scope;
View
3 src/Contours.h
@@ -14,12 +14,15 @@ class Contour: public node::ObjectWrap {
Contour();
//JSFUNC(Size)
+ static Handle<Value> Point(const v8::Arguments&);
static Handle<Value> Size(const v8::Arguments&);
static Handle<Value> CornerCount(const v8::Arguments&);
static Handle<Value> Area(const v8::Arguments&);
static Handle<Value> ArcLength(const v8::Arguments&);
static Handle<Value> ApproxPolyDP(const v8::Arguments&);
+ static Handle<Value> ConvexHull(const v8::Arguments&);
static Handle<Value> BoundingRect(const v8::Arguments&);
+ static Handle<Value> MinAreaRect(const v8::Arguments&);
static Handle<Value> IsConvex(const v8::Arguments&);
};

0 comments on commit bb1fa03

Please sign in to comment.
Something went wrong with that request. Please try again.