From 7ec393ac0995d8ea0033bfcc3dc8f532f3c5600c Mon Sep 17 00:00:00 2001 From: Yu Jiang Tham Date: Fri, 28 Feb 2014 23:14:55 -0800 Subject: [PATCH 1/2] Added matchTemplate and minMaxLoc --- src/Matrix.cc | 79 +++++++++++++++++++++++++++++++++++++++++++++++++++ src/Matrix.h | 3 ++ 2 files changed, 82 insertions(+) diff --git a/src/Matrix.cc b/src/Matrix.cc index 72a8dff..79d0261 100755 --- a/src/Matrix.cc +++ b/src/Matrix.cc @@ -92,6 +92,9 @@ Matrix::Init(Handle target) { NODE_SET_PROTOTYPE_METHOD(constructor, "floodFill", FloodFill); + NODE_SET_PROTOTYPE_METHOD(constructor, "matchTemplate", MatchTemplate); + NODE_SET_PROTOTYPE_METHOD(constructor, "minMaxLoc", MinMaxLoc); + NODE_SET_METHOD(constructor, "Eye", Eye); @@ -1530,3 +1533,79 @@ Matrix::FloodFill(const Arguments& args){ } +// @author ytham +// Match Template filter +// Usage: output = input.matchTemplate("templateFileString", method); +Handle +Matrix::MatchTemplate(const v8::Arguments& args) { + HandleScope scope; + + Matrix *self = ObjectWrap::Unwrap(args.This()); + + v8::String::Utf8Value args0(args[0]->ToString()); + std::string filename = std::string(*args0); + cv::Mat templ; + templ = cv::imread(filename, CV_8S); + + Local out = Matrix::constructor->GetFunction()->NewInstance(); + Matrix *m_out = ObjectWrap::Unwrap(out); + int cols = self->mat.cols - templ.cols + 1; + int rows = self->mat.rows - templ.rows + 1; + m_out->mat.create(cols, rows, CV_32FC1); + + /* + TM_SQDIFF =0 + TM_SQDIFF_NORMED =1 + TM_CCORR =2 + TM_CCORR_NORMED =3 + TM_CCOEFF =4 + TM_CCOEFF_NORMED =5 + */ + int method = (args.Length() < 2) ? (int)cv::TM_CCORR_NORMED : args[1]->Uint32Value(); + + cv::matchTemplate(self->mat, templ, m_out->mat, method); + + double minVal; double maxVal; cv::Point minLoc; cv::Point maxLoc; + cv::minMaxLoc(m_out->mat, &minVal, &maxVal, &minLoc, &maxLoc, cv::Mat() ); + + return scope.Close(out); +} + + +// @author ytham +// Min/Max location +Handle +Matrix::MinMaxLoc(const v8::Arguments& args) { + HandleScope scope; + + Matrix *self = ObjectWrap::Unwrap(args.This()); + + double minVal; double maxVal; cv::Point minLoc; cv::Point maxLoc; + + cv::minMaxLoc(self->mat, &minVal, &maxVal, &minLoc, &maxLoc, cv::Mat() ); + + Local v_minVal = v8::Number::New(minVal); + Local v_maxVal = v8::Number::New(maxVal); + Local v_minLoc_x = v8::Number::New(minLoc.x); + Local v_minLoc_y = v8::Number::New(minLoc.y); + Local v_maxLoc_x = v8::Number::New(maxLoc.x); + Local v_maxLoc_y = v8::Number::New(maxLoc.y); + + Local o_minLoc = Object::New(); + o_minLoc->Set(String::NewSymbol("x"), v_minLoc_x); + o_minLoc->Set(String::NewSymbol("y"), v_minLoc_y); + + Local o_maxLoc = Object::New(); + o_maxLoc->Set(String::NewSymbol("x"), v_maxLoc_x); + o_maxLoc->Set(String::NewSymbol("y"), v_maxLoc_y); + + // Output result object + Local result = Object::New(); + result->Set(String::NewSymbol("minVal"), v_minVal); + result->Set(String::NewSymbol("maxVal"), v_maxVal); + result->Set(String::NewSymbol("minLoc"), o_minLoc); + result->Set(String::NewSymbol("maxLoc"), o_maxLoc);= + + + return scope.Close(result); +} diff --git a/src/Matrix.h b/src/Matrix.h index 52fbb9f..5424597 100755 --- a/src/Matrix.h +++ b/src/Matrix.h @@ -84,6 +84,9 @@ class Matrix: public node::ObjectWrap { JSFUNC(EqualizeHist) JSFUNC(Pixel) JSFUNC(FloodFill) + + JSFUNC(MatchTemplate) + JSFUNC(MinMaxLoc) /* static Handle Val(const Arguments& args); static Handle RowRange(const Arguments& args); From c3b123c936cc84d4838497cfe712553763c4fe08 Mon Sep 17 00:00:00 2001 From: Yu Jiang Tham Date: Fri, 28 Feb 2014 23:20:14 -0800 Subject: [PATCH 2/2] Typo correction --- src/Matrix.cc | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/Matrix.cc b/src/Matrix.cc index 79d0261..7d8a672 100755 --- a/src/Matrix.cc +++ b/src/Matrix.cc @@ -1604,8 +1604,7 @@ Matrix::MinMaxLoc(const v8::Arguments& args) { result->Set(String::NewSymbol("minVal"), v_minVal); result->Set(String::NewSymbol("maxVal"), v_maxVal); result->Set(String::NewSymbol("minLoc"), o_minLoc); - result->Set(String::NewSymbol("maxLoc"), o_maxLoc);= + result->Set(String::NewSymbol("maxLoc"), o_maxLoc); - return scope.Close(result); }