From 1c293197331963958f9328ca4fe79642d332c926 Mon Sep 17 00:00:00 2001 From: John Ludwig Date: Wed, 23 Apr 2014 18:13:35 -0700 Subject: [PATCH 1/4] add warp calls and example --- examples/warp_image.js | 23 ++++++++++++++++++ src/Matrix.cc | 54 ++++++++++++++++++++++++++++++++++++++++++ src/Matrix.h | 5 +++- 3 files changed, 81 insertions(+), 1 deletion(-) create mode 100644 examples/warp_image.js diff --git a/examples/warp_image.js b/examples/warp_image.js new file mode 100644 index 0000000..b2ebfeb --- /dev/null +++ b/examples/warp_image.js @@ -0,0 +1,23 @@ +var cv = require('../lib/opencv'); + +cv.readImage("./quads.jpg", 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/warp.jpg"); + +}); + diff --git a/src/Matrix.cc b/src/Matrix.cc index 8ceb174..643f6af 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) { + SETUP_FUNCTION(Matrix) + + // 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); */ From 1ac7f44ef317c7352f7717fd97e785569e911a02 Mon Sep 17 00:00:00 2001 From: John Ludwig Date: Wed, 23 Apr 2014 18:20:17 -0700 Subject: [PATCH 2/4] back out the background subtractor fails to build on osx --- binding.gyp | 1 - 1 file changed, 1 deletion(-) diff --git a/binding.gyp b/binding.gyp index 72df9f3..406d74a 100755 --- a/binding.gyp +++ b/binding.gyp @@ -12,7 +12,6 @@ , "src/CamShift.cc" , "src/HighGUI.cc" , "src/FaceRecognizer.cc" - , "src/BackgroundSubtractor.cc" ] , 'libraries': [ ' Date: Fri, 9 May 2014 11:27:16 -0700 Subject: [PATCH 3/4] Revert "back out the background subtractor" This reverts commit 1ac7f44ef317c7352f7717fd97e785569e911a02. --- binding.gyp | 1 + 1 file changed, 1 insertion(+) diff --git a/binding.gyp b/binding.gyp index 406d74a..72df9f3 100755 --- a/binding.gyp +++ b/binding.gyp @@ -12,6 +12,7 @@ , "src/CamShift.cc" , "src/HighGUI.cc" , "src/FaceRecognizer.cc" + , "src/BackgroundSubtractor.cc" ] , 'libraries': [ ' Date: Fri, 9 May 2014 14:08:47 -0700 Subject: [PATCH 4/4] fix up sample; and improve arg calling --- examples/warp_image.js | 6 +++--- src/Matrix.cc | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/examples/warp_image.js b/examples/warp_image.js index b2ebfeb..9b11178 100644 --- a/examples/warp_image.js +++ b/examples/warp_image.js @@ -1,6 +1,6 @@ var cv = require('../lib/opencv'); -cv.readImage("./quads.jpg", function(err, im) { +cv.readImage("./mona.png", function(err, im) { var srcArray = [ 0,0, @@ -10,14 +10,14 @@ cv.readImage("./quads.jpg", function(err, im) { var dstArray = [ 0,0, im.width()*.9,im.height()*.1, - im.width().im.height(), + 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/warp.jpg"); + img_warp.save("/tmp/mona_warp.png"); }); diff --git a/src/Matrix.cc b/src/Matrix.cc index 643f6af..5b0f960 100755 --- a/src/Matrix.cc +++ b/src/Matrix.cc @@ -1762,7 +1762,7 @@ Matrix::PutText(const v8::Arguments& args) { Handle Matrix::GetPerspectiveTransform(const v8::Arguments& args) { - SETUP_FUNCTION(Matrix) + HandleScope scope; // extract quad args Local srcArray = args[0]->ToObject();