diff --git a/examples/warp_image.js b/examples/warp_image.js new file mode 100644 index 0000000..9b11178 --- /dev/null +++ b/examples/warp_image.js @@ -0,0 +1,23 @@ +var cv = require('../lib/opencv'); + +cv.readImage("./mona.png", function(err, im) { + + var srcArray = [ + 0,0, + im.width(),0, + im.width(),im.height(), + 0,im.height()]; + var dstArray = [ + 0,0, + im.width()*.9,im.height()*.1, + im.width(),im.height(), + im.width()*.2,im.height()*.8]; + + var xfrmMat = im.getPerspectiveTransform(srcArray,dstArray); + img_warp = im.copy(); + img_warp.warpPerspective(xfrmMat,im.width,im.height,[255,255,255]); + + img_warp.save("/tmp/mona_warp.png"); + +}); + diff --git a/src/Matrix.cc b/src/Matrix.cc index 8ceb174..5b0f960 100755 --- a/src/Matrix.cc +++ b/src/Matrix.cc @@ -100,6 +100,9 @@ Matrix::Init(Handle target) { NODE_SET_PROTOTYPE_METHOD(constructor, "pushBack", PushBack); NODE_SET_PROTOTYPE_METHOD(constructor, "putText", PutText); + + NODE_SET_PROTOTYPE_METHOD(constructor, "getPerspectiveTransform", GetPerspectiveTransform); + NODE_SET_PROTOTYPE_METHOD(constructor, "warpPerspective", WarpPerspective); NODE_SET_METHOD(constructor, "Eye", Eye); @@ -1756,3 +1759,54 @@ Matrix::PutText(const v8::Arguments& args) { return scope.Close(Undefined()); } + +Handle +Matrix::GetPerspectiveTransform(const v8::Arguments& args) { + HandleScope scope; + + // extract quad args + Local srcArray = args[0]->ToObject(); + Local tgtArray = args[1]->ToObject(); + + std::vector src_corners(4); + std::vector tgt_corners(4); + for (unsigned int i = 0; i < 4; i++) { + src_corners[i] = cvPoint(srcArray->Get(i*2)->IntegerValue(),srcArray->Get(i*2+1)->IntegerValue()); + tgt_corners[i] = cvPoint(tgtArray->Get(i*2)->IntegerValue(),tgtArray->Get(i*2+1)->IntegerValue()); + } + + Local xfrm = Matrix::constructor->GetFunction()->NewInstance(); + Matrix *xfrmmat = ObjectWrap::Unwrap(xfrm); + xfrmmat->mat = cv::getPerspectiveTransform(src_corners, tgt_corners); + + return scope.Close(xfrm); +} + +Handle +Matrix::WarpPerspective(const v8::Arguments& args) { + SETUP_FUNCTION(Matrix) + + Matrix *xfrm = ObjectWrap::Unwrap(args[0]->ToObject()); + + int width = args[1]->IntegerValue(); + int height = args[2]->IntegerValue(); + + int flags = cv::INTER_LINEAR; + int borderMode = cv::BORDER_REPLICATE; + + cv::Scalar borderColor(0, 0, 255); + + if(args[3]->IsArray()) { + Local objColor = args[3]->ToObject(); + borderColor = setColor(objColor); + } + + cv::Mat res = cv::Mat(width, height, CV_32FC3); + + cv::warpPerspective(self->mat, res, xfrm->mat, cv::Size(width, height), flags, borderMode, borderColor); + + ~self->mat; + self->mat = res; + + return scope.Close(v8::Null()); +} diff --git a/src/Matrix.h b/src/Matrix.h index b0468e7..7257093 100755 --- a/src/Matrix.h +++ b/src/Matrix.h @@ -94,6 +94,8 @@ class Matrix: public node::ObjectWrap { JSFUNC(PushBack) JSFUNC(PutText) + JSFUNC(GetPerspectiveTransform) + JSFUNC(WarpPerspective) /* static Handle Val(const Arguments& args); static Handle RowRange(const Arguments& args); @@ -121,7 +123,8 @@ class Matrix: public node::ObjectWrap { static Handle Depth(const Arguments& args); static Handle Channels(const Arguments& args); static Handle StepOne(const Arguments& args); - + static Handle GetPerspectiveTransform(const Arguments& args); + static Handle WarpPerspective(const Arguments& args); */