diff --git a/src/Contours.cc b/src/Contours.cc index 8b1431c..dcc5b31 100755 --- a/src/Contours.cc +++ b/src/Contours.cc @@ -23,7 +23,8 @@ Contour::Init(Handle target) { //Local proto = constructor->PrototypeTemplate(); - NODE_SET_PROTOTYPE_METHOD(constructor, "point", Point); + NODE_SET_PROTOTYPE_METHOD(constructor, "point", Point); + NODE_SET_PROTOTYPE_METHOD(constructor, "points", Points); NODE_SET_PROTOTYPE_METHOD(constructor, "size", Size); NODE_SET_PROTOTYPE_METHOD(constructor, "cornerCount", CornerCount); NODE_SET_PROTOTYPE_METHOD(constructor, "area", Area); @@ -35,6 +36,8 @@ Contour::Init(Handle target) { NODE_SET_PROTOTYPE_METHOD(constructor, "isConvex", IsConvex); NODE_SET_PROTOTYPE_METHOD(constructor, "moments", Moments); NODE_SET_PROTOTYPE_METHOD(constructor, "hierarchy", Hierarchy); + NODE_SET_PROTOTYPE_METHOD(constructor, "serialize", Serialize); + NODE_SET_PROTOTYPE_METHOD(constructor, "deserialize", Deserialize); target->Set(String::NewSymbol("Contours"), m->GetFunction()); }; @@ -75,6 +78,28 @@ Contour::Point(const Arguments &args) { return scope.Close(data); } +Handle +Contour::Points(const Arguments &args) { + HandleScope scope; + + Contour *self = ObjectWrap::Unwrap(args.This()); + int pos = args[0]->NumberValue(); + + vector points = self->contours[pos]; + + Local data = Array::New(points.size()); + + for (std::vector::size_type i = 0; i != points.size(); i++) { + Local point_data = Object::New(); + point_data->Set(String::NewSymbol("x"), Number::New(points[i].x)); + point_data->Set(String::NewSymbol("y"), Number::New(points[i].y)); + + data->Set(i, point_data); + } + + 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. @@ -260,4 +285,92 @@ Contour::Hierarchy(const Arguments &args) { res->Set(3, Number::New(hierarchy[3])); return scope.Close(res); +} + +Handle +Contour::Serialize(const Arguments &args) { + HandleScope scope; + + Contour *self = ObjectWrap::Unwrap(args.This()); + + Local contours_data = Array::New(self->contours.size()); + + for (std::vector::size_type i = 0; i != self->contours.size(); i++) { + vector points = self->contours[i]; + Local contour_data = Array::New(points.size()); + + for (std::vector::size_type j = 0; j != points.size(); j++) { + Local point_data = Array::New(2); + point_data->Set(0, Number::New(points[j].x)); + point_data->Set(1, Number::New(points[j].y)); + + contour_data->Set(j, point_data); + } + + contours_data->Set(i, contour_data); + } + + Local hierarchy_data = Array::New(self->hierarchy.size()); + for (std::vector::size_type i = 0; i != self->hierarchy.size(); i++) { + Local contour_data = Array::New(4); + contour_data->Set(0, Number::New(self->hierarchy[i][0])); + contour_data->Set(1, Number::New(self->hierarchy[i][1])); + contour_data->Set(2, Number::New(self->hierarchy[i][2])); + contour_data->Set(3, Number::New(self->hierarchy[i][3])); + + hierarchy_data->Set(i, contour_data); + } + + Local data = Object::New(); + data->Set(String::NewSymbol("contours"), contours_data); + data->Set(String::NewSymbol("hierarchy"), hierarchy_data); + + return scope.Close(data); +} + +Handle +Contour::Deserialize(const Arguments &args) { + HandleScope scope; + + Contour *self = ObjectWrap::Unwrap(args.This()); + + Handle data = Handle::Cast(args[0]); + + Handle contours_data = Handle::Cast(data->Get(v8::String::NewSymbol("contours"))); + Handle hierarchy_data = Handle::Cast(data->Get(v8::String::NewSymbol("hierarchy"))); + + vector> contours_res; + int contours_length = contours_data->Length(); + + for (int i = 0; i < contours_length; i++) { + Handle contour_data = Handle::Cast(contours_data->Get(i)); + vector points; + + int contour_length = contour_data->Length(); + for (int j = 0; j < contour_length; j++) { + Handle point_data = Handle::Cast(contour_data->Get(j)); + int x = point_data->Get(0)->IntegerValue(); + int y = point_data->Get(1)->IntegerValue(); + points.push_back(cv::Point(x, y)); + } + + contours_res.push_back(points); + } + + vector hierarchy_res; + int hierarchy_length = hierarchy_data->Length(); + + for (int i = 0; i < hierarchy_length; i++) { + Handle contour_data = Handle::Cast(hierarchy_data->Get(i)); + int a = contour_data->Get(0)->IntegerValue(); + int b = contour_data->Get(1)->IntegerValue(); + int c = contour_data->Get(2)->IntegerValue(); + int d = contour_data->Get(3)->IntegerValue(); + hierarchy_res.push_back(cv::Vec4i(a, b, c, d)); + } + + self->contours = contours_res; + self->hierarchy = hierarchy_res; + + return scope.Close(v8::Null()); } \ No newline at end of file diff --git a/src/Contours.h b/src/Contours.h index 059316f..548e0e9 100755 --- a/src/Contours.h +++ b/src/Contours.h @@ -13,10 +13,11 @@ class Contour: public node::ObjectWrap { static void Init(Handle target); static Handle New(const Arguments &args); - Contour(); - + Contour(); + //JSFUNC(Size) - static Handle Point(const v8::Arguments&); + static Handle Point(const v8::Arguments&); + static Handle Points(const v8::Arguments&); static Handle Size(const v8::Arguments&); static Handle CornerCount(const v8::Arguments&); static Handle Area(const v8::Arguments&); @@ -28,5 +29,7 @@ class Contour: public node::ObjectWrap { static Handle IsConvex(const v8::Arguments&); static Handle Moments(const v8::Arguments&); static Handle Hierarchy(const v8::Arguments&); + static Handle Serialize(const v8::Arguments&); + static Handle Deserialize(const v8::Arguments&); };