From 7b3835bbf54178edc8f2b3415abb6117499a54eb Mon Sep 17 00:00:00 2001 From: Ryan Lord Date: Wed, 1 May 2013 14:12:30 +0100 Subject: [PATCH] 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)