From dfc9bfacd1ec154526052411132ce6f2ac5c0204 Mon Sep 17 00:00:00 2001 From: ser1zw Date: Sat, 2 Apr 2011 21:41:09 +0900 Subject: [PATCH] fixed and tested CvMat#match_template --- ext/cvmat.cpp | 18 ++++++---- ext/opencv.cpp | 8 +++++ test/samples/lena-eyes.jpg | Bin 0 -> 3174 bytes test/test_cvmat_imageprocessing.rb | 51 +++++++++++++++++++++++++++++ test/test_opencv.rb | 8 +++++ 5 files changed, 79 insertions(+), 6 deletions(-) create mode 100644 test/samples/lena-eyes.jpg diff --git a/ext/cvmat.cpp b/ext/cvmat.cpp index 9459045..43bbda1 100644 --- a/ext/cvmat.cpp +++ b/ext/cvmat.cpp @@ -4620,7 +4620,7 @@ rb_equalize_hist(VALUE self) * Compares template against overlapped image regions. * method is specifies the way the template must be compared with image regions. - * method should be following symbol. (see CvMat::MATCH_TEMPLATE_METHOD 's key and value.) + * method should be following symbol. (see OpenCV::MATCH_TEMPLATE_METHOD 's key and value.) * * * :sqdiff * R(x,y)=sumx',y'[T(x',y')-I(x+x',y+y')]2 @@ -4646,16 +4646,22 @@ VALUE rb_match_template(int argc, VALUE *argv, VALUE self) { VALUE templ, method, result; - rb_scan_args(argc, argv, "11", &templ, &method); + int method_flag; + if (rb_scan_args(argc, argv, "11", &templ, &method) == 1) + method_flag = CV_TM_SQDIFF; + else + method_flag = CVMETHOD("MATCH_TEMPLATE_METHOD", method); + if (!(rb_obj_is_kind_of(templ, cCvMat::rb_class()))) rb_raise(rb_eTypeError, "argument 1 (template) should be %s.", rb_class2name(cCvMat::rb_class())); if (cvGetElemType(CVARR(self)) != cvGetElemType(CVARR(templ))) rb_raise(rb_eTypeError, "template should be same type of self."); - CvSize src_size = cvGetSize(CVARR(self)), template_size = cvGetSize(CVARR(self)); - result = cCvMat::new_object(cvSize(src_size.width - template_size.width + 1, - src_size.height - template_size.height + 1), + CvSize src_size = cvGetSize(CVARR(self)); + CvSize template_size = cvGetSize(CVARR(templ)); + result = cCvMat::new_object(src_size.height - template_size.height + 1, + src_size.width - template_size.width + 1, CV_32FC1); - cvMatchTemplate(CVARR(self), CVARR(templ), CVARR(result), CVMETHOD("MATCH_TEMPLATE_METHOD", CV_TM_SQDIFF)); + cvMatchTemplate(CVARR(self), CVARR(templ), CVARR(result), method_flag); return result; } diff --git a/ext/opencv.cpp b/ext/opencv.cpp index 4561d65..99cf64b 100644 --- a/ext/opencv.cpp +++ b/ext/opencv.cpp @@ -243,6 +243,14 @@ define_ruby_module() /* Inpaint method */ rb_define_const(rb_module, "CV_INPAINT_NS", INT2FIX(CV_INPAINT_NS)); rb_define_const(rb_module, "CV_INPAINT_TELEA", INT2FIX(CV_INPAINT_TELEA)); + + /* Match template method */ + rb_define_const(rb_module, "CV_TM_SQDIFF", INT2FIX(CV_TM_SQDIFF)); + rb_define_const(rb_module, "CV_TM_SQDIFF_NORMED", INT2FIX(CV_TM_SQDIFF_NORMED)); + rb_define_const(rb_module, "CV_TM_CCORR", INT2FIX(CV_TM_CCORR)); + rb_define_const(rb_module, "CV_TM_CCORR_NORMED", INT2FIX(CV_TM_CCORR_NORMED)); + rb_define_const(rb_module, "CV_TM_CCOEFF", INT2FIX(CV_TM_CCOEFF)); + rb_define_const(rb_module, "CV_TM_CCOEFF_NORMED", INT2FIX(CV_TM_CCOEFF_NORMED)); VALUE inversion_method = rb_hash_new(); /* {:lu, :svd, :svd_sym(:svd_symmetric)}: Inversion method */ diff --git a/test/samples/lena-eyes.jpg b/test/samples/lena-eyes.jpg new file mode 100644 index 0000000000000000000000000000000000000000..e3f2caa70827ce58e128dd54522c3d5d3d284a9e GIT binary patch literal 3174 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 CvColor::Black, :thickness => 3) + # snap mat, templ, result + end end diff --git a/test/test_opencv.rb b/test/test_opencv.rb index 09a63ee..4567e83 100755 --- a/test/test_opencv.rb +++ b/test/test_opencv.rb @@ -80,6 +80,14 @@ class TestOpenCV < OpenCVTestCase # Inpaint method assert_equal(0, CV_INPAINT_NS) assert_equal(1, CV_INPAINT_TELEA) + + # Match tempalte method + assert_equal(0, CV_TM_SQDIFF) + assert_equal(1, CV_TM_SQDIFF_NORMED) + assert_equal(2, CV_TM_CCORR) + assert_equal(3, CV_TM_CCORR_NORMED) + assert_equal(4, CV_TM_CCOEFF) + assert_equal(5, CV_TM_CCOEFF_NORMED) end def test_symbols