From cca52ad691cac78069532d252dd7c0259e9750dd Mon Sep 17 00:00:00 2001 From: Ryan Lord Date: Wed, 1 May 2013 02:10:27 +0100 Subject: [PATCH 1/4] Added cv::flip function to Matrix objects --- src/Matrix.cc | 21 +++++++++++++++++++++ src/Matrix.h | 1 + 2 files changed, 22 insertions(+) diff --git a/src/Matrix.cc b/src/Matrix.cc index ed4a24c..44cb1c1 100755 --- a/src/Matrix.cc +++ b/src/Matrix.cc @@ -54,6 +54,7 @@ Matrix::Init(Handle target) { NODE_SET_PROTOTYPE_METHOD(constructor, "convertHSVscale", ConvertHSVscale); NODE_SET_PROTOTYPE_METHOD(constructor, "gaussianBlur", GaussianBlur); NODE_SET_PROTOTYPE_METHOD(constructor, "copy", Copy); + NODE_SET_PROTOTYPE_METHOD(constructor, "flip", Flip); NODE_SET_PROTOTYPE_METHOD(constructor, "ptr", Ptr); NODE_SET_PROTOTYPE_METHOD(constructor, "addWeighted", AddWeighted); NODE_SET_PROTOTYPE_METHOD(constructor, "split", Split); @@ -692,6 +693,26 @@ Matrix::Copy(const v8::Arguments& args) { } +Handle +Matrix::Flip(const v8::Arguments& args) { + HandleScope scope; + + Matrix *self = ObjectWrap::Unwrap(args.This()); + + if ( args.Length() < 1 || !args[0]->IsInt32() ) { + return v8::ThrowException(String::New("Flip requires an integer flipCode argument (0 = X axis, positive = Y axis, negative = both axis")); + } + + int flipCode = args[0]->ToInt32()->Value(); + + Local img_to_return = Matrix::constructor->GetFunction()->NewInstance(); + Matrix *img = ObjectWrap::Unwrap(img_to_return); + cv::flip(self->mat, img->mat, flipCode); + + return scope.Close(img_to_return); +} + + Handle Matrix::Ptr(const v8::Arguments& args) { HandleScope scope; diff --git a/src/Matrix.h b/src/Matrix.h index de6652f..1d6886a 100755 --- a/src/Matrix.h +++ b/src/Matrix.h @@ -49,6 +49,7 @@ class Matrix: public node::ObjectWrap { JSFUNC(ConvertHSVscale) JSFUNC(GaussianBlur) JSFUNC(Copy) + JSFUNC(Flip) JSFUNC(Ptr) JSFUNC(AddWeighted) JSFUNC(Split) From c4a20bb279423f46a204025db780b447500ec884 Mon Sep 17 00:00:00 2001 From: Ryan Lord Date: Wed, 1 May 2013 02:18:55 +0100 Subject: [PATCH 2/4] Made exception from ::flip throw a type error --- src/Matrix.cc | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/Matrix.cc b/src/Matrix.cc index 44cb1c1..fe81e3f 100755 --- a/src/Matrix.cc +++ b/src/Matrix.cc @@ -700,7 +700,8 @@ Matrix::Flip(const v8::Arguments& args) { Matrix *self = ObjectWrap::Unwrap(args.This()); if ( args.Length() < 1 || !args[0]->IsInt32() ) { - return v8::ThrowException(String::New("Flip requires an integer flipCode argument (0 = X axis, positive = Y axis, negative = both axis")); + return v8::ThrowException(Exception::TypeError(String::New( + "Flip requires an integer flipCode argument (0 = X axis, positive = Y axis, negative = both axis)"))); } int flipCode = args[0]->ToInt32()->Value(); From c3d1379cd5491082357cb8d15bdd2737980a4727 Mon Sep 17 00:00:00 2001 From: Ryan Lord Date: Wed, 1 May 2013 11:50:37 +0100 Subject: [PATCH 3/4] Added ROI bindings to Matrix --- src/Matrix.cc | 28 ++++++++++++++++++++++++++++ src/Matrix.h | 1 + 2 files changed, 29 insertions(+) diff --git a/src/Matrix.cc b/src/Matrix.cc index fe81e3f..dfde4bd 100755 --- a/src/Matrix.cc +++ b/src/Matrix.cc @@ -55,6 +55,7 @@ Matrix::Init(Handle target) { NODE_SET_PROTOTYPE_METHOD(constructor, "gaussianBlur", GaussianBlur); NODE_SET_PROTOTYPE_METHOD(constructor, "copy", Copy); NODE_SET_PROTOTYPE_METHOD(constructor, "flip", Flip); + NODE_SET_PROTOTYPE_METHOD(constructor, "roi", ROI); NODE_SET_PROTOTYPE_METHOD(constructor, "ptr", Ptr); NODE_SET_PROTOTYPE_METHOD(constructor, "addWeighted", AddWeighted); NODE_SET_PROTOTYPE_METHOD(constructor, "split", Split); @@ -714,6 +715,33 @@ Matrix::Flip(const v8::Arguments& args) { } +Handle +Matrix::ROI(const v8::Arguments& args) { + HandleScope scope; + + Matrix *self = ObjectWrap::Unwrap(args.This()); + + if ( args.Length() != 4 ) { + return v8::ThrowException(Exception::TypeError(String::New( + "ROI requires x,y,w,h arguments"))); + } + + // although it's an image to return, it is in fact a pointer to ROI of parent matrix + Local img_to_return = Matrix::constructor->GetFunction()->NewInstance(); + Matrix *img = ObjectWrap::Unwrap(img_to_return); + + int x = args[0]->IntegerValue(); + int y = args[1]->IntegerValue(); + int w = args[2]->IntegerValue(); + int h = args[3]->IntegerValue(); + + cv::Mat roi(self->mat, cv::Rect(x,y,w,h)); + img->mat = roi; + + return scope.Close(img_to_return); +} + + Handle Matrix::Ptr(const v8::Arguments& args) { HandleScope scope; diff --git a/src/Matrix.h b/src/Matrix.h index 1d6886a..c869706 100755 --- a/src/Matrix.h +++ b/src/Matrix.h @@ -50,6 +50,7 @@ class Matrix: public node::ObjectWrap { JSFUNC(GaussianBlur) JSFUNC(Copy) JSFUNC(Flip) + JSFUNC(ROI) JSFUNC(Ptr) JSFUNC(AddWeighted) JSFUNC(Split) From 7b3835bbf54178edc8f2b3415abb6117499a54eb Mon Sep 17 00:00:00 2001 From: Ryan Lord Date: Wed, 1 May 2013 14:12:30 +0100 Subject: [PATCH 4/4] Matrix::rotate bind using cv::warpAffine --- src/Matrix.cc | 25 +++++++++++++++++++++++++ src/Matrix.h | 1 + 2 files changed, 26 insertions(+) diff --git a/src/Matrix.cc b/src/Matrix.cc index dfde4bd..8543b5b 100755 --- a/src/Matrix.cc +++ b/src/Matrix.cc @@ -46,6 +46,7 @@ Matrix::Init(Handle target) { NODE_SET_PROTOTYPE_METHOD(constructor, "save", Save); NODE_SET_PROTOTYPE_METHOD(constructor, "saveAsync", SaveAsync); NODE_SET_PROTOTYPE_METHOD(constructor, "resize", Resize); + NODE_SET_PROTOTYPE_METHOD(constructor, "rotate", Rotate); NODE_SET_PROTOTYPE_METHOD(constructor, "pyrDown", PyrDown); NODE_SET_PROTOTYPE_METHOD(constructor, "pyrUp", PyrUp); NODE_SET_PROTOTYPE_METHOD(constructor, "channels", Channels); @@ -973,6 +974,30 @@ Matrix::Resize(const v8::Arguments& args){ return scope.Close(Undefined()); } + +Handle +Matrix::Rotate(const v8::Arguments& args){ + HandleScope scope; + + Matrix *self = ObjectWrap::Unwrap(args.This()); + cv::Mat rotMatrix(2, 3, CV_32FC1); + cv::Mat res; + + float angle = args[0]->ToNumber()->Value(); + int x = args[1]->IsUndefined() ? round(self->mat.size().width / 2) : args[1]->Uint32Value(); + int y = args[1]->IsUndefined() ? round(self->mat.size().height / 2) : args[2]->Uint32Value(); + + cv::Point center = cv::Point(x,y); + + rotMatrix = getRotationMatrix2D(center, angle, 1.0); + + cv::warpAffine(self->mat, res, rotMatrix, self->mat.size()); + ~self->mat; + self->mat = res; + + return scope.Close(Undefined()); +} + Handle Matrix::PyrDown(const v8::Arguments& args){ SETUP_FUNCTION(Matrix) diff --git a/src/Matrix.h b/src/Matrix.h index c869706..a9dd9b3 100755 --- a/src/Matrix.h +++ b/src/Matrix.h @@ -42,6 +42,7 @@ class Matrix: public node::ObjectWrap { JSFUNC(ToBufferAsync) JSFUNC(Resize) + JSFUNC(Rotate) JSFUNC(PyrDown) JSFUNC(PyrUp)