From b3e2d7e017136dd3049c3d30ad5bd058ed34d2b2 Mon Sep 17 00:00:00 2001 From: ser1zw Date: Sun, 3 Apr 2011 02:12:42 +0900 Subject: [PATCH] implemented and tested CvMat#match_shapes --- ext/cvmat.cpp | 62 ++++++++++++++++++++--------- ext/cvmat.h | 1 + ext/opencv.cpp | 12 ++++++ test/samples/str-cv-rotated.jpg | Bin 0 -> 2329 bytes test/samples/str-cv.jpg | Bin 0 -> 2337 bytes test/samples/str-ov.jpg | Bin 0 -> 2443 bytes test/test_cvmat_imageprocessing.rb | 51 ++++++++++++++++++++++++ test/test_opencv.rb | 10 +++++ 8 files changed, 118 insertions(+), 18 deletions(-) create mode 100644 test/samples/str-cv-rotated.jpg create mode 100644 test/samples/str-cv.jpg create mode 100644 test/samples/str-ov.jpg diff --git a/ext/cvmat.cpp b/ext/cvmat.cpp index 43bbda1..8e77df7 100644 --- a/ext/cvmat.cpp +++ b/ext/cvmat.cpp @@ -381,6 +381,7 @@ void define_ruby_class() rb_define_method(rb_klass, "equalize_hist", RUBY_METHOD_FUNC(rb_equalize_hist), 0); rb_define_method(rb_klass, "match_template", RUBY_METHOD_FUNC(rb_match_template), -1); + rb_define_method(rb_klass, "match_shapes", RUBY_METHOD_FUNC(rb_match_shapes), -1); rb_define_method(rb_klass, "match_shapes_i1", RUBY_METHOD_FUNC(rb_match_shapes_i1), -1); rb_define_method(rb_klass, "match_shapes_i2", RUBY_METHOD_FUNC(rb_match_shapes_i2), -1); rb_define_method(rb_klass, "match_shapes_i3", RUBY_METHOD_FUNC(rb_match_shapes_i3), -1); @@ -4665,23 +4666,56 @@ rb_match_template(int argc, VALUE *argv, VALUE self) return result; } +/* + * call-seq: + * match_shapes(object, method) -> float + * + * Compares two shapes(self and object). object should be CvMat or CvContour. + * + * A - object1, B - object2: + * * method=CV_CONTOUR_MATCH_I1 + * I1(A,B)=sumi=1..7abs(1/mAi - 1/mBi) + * * method=CV_CONTOUR_MATCH_I2 + * I2(A,B)=sumi=1..7abs(mAi - mBi) + * * method=CV_CONTOUR_MATCH_I3 + * I3(A,B)=sumi=1..7abs(mAi - mBi)/abs(mAi) + */ +VALUE +rb_match_shapes(int argc, VALUE *argv, VALUE self) +{ + VALUE object, method, param; + rb_scan_args(argc, argv, "21", &object, &method, ¶m); + int method_flag = CVMETHOD("COMPARISON_METHOD", method); + if (!(rb_obj_is_kind_of(object, cCvMat::rb_class()) || rb_obj_is_kind_of(object, cCvContour::rb_class()))) + rb_raise(rb_eTypeError, "argument 1 (shape) should be %s or %s", + rb_class2name(cCvMat::rb_class()), rb_class2name(cCvContour::rb_class())); + return rb_float_new(cvMatchShapes(CVARR(self), CVARR(object), method_flag)); +} + +inline VALUE +rb_match_shapes_internal(int argc, VALUE *argv, VALUE self, int method) +{ + VALUE object; + rb_scan_args(argc, argv, "10", &object); + if (!(rb_obj_is_kind_of(object, cCvMat::rb_class()) || rb_obj_is_kind_of(object, cCvContour::rb_class()))) + rb_raise(rb_eTypeError, "argument 1 (shape) should be %s or %s", + rb_class2name(cCvMat::rb_class()), rb_class2name(cCvContour::rb_class())); + return rb_float_new(cvMatchShapes(CVARR(self), CVARR(object), method)); +} + /* * call-seq: * match_shapes_i1(object) -> float * * Compares two shapes(self and object). object should be CvMat or CvContour. * - * A ~ object1, B - object2): + * A - object1, B - object2: * I1(A,B)=sumi=1..7abs(1/mAi - 1/mBi) */ VALUE rb_match_shapes_i1(int argc, VALUE *argv, VALUE self) { - VALUE object; - rb_scan_args(argc, argv, "10", &object); - if ((!(rb_obj_is_kind_of(object, cCvMat::rb_class()))) && (!(rb_obj_is_kind_of(object, cCvContour::rb_class())))) - rb_raise(rb_eTypeError, "argument 1 (shape) should be %s or %s", rb_class2name(cCvMat::rb_class()), rb_class2name(cCvContour::rb_class())); - return rb_float_new(cvMatchShapes(CVARR(self), CVARR(object), CV_CONTOURS_MATCH_I1)); + return rb_match_shapes_internal(argc, argv, self, CV_CONTOURS_MATCH_I1); } /* @@ -4690,17 +4724,13 @@ rb_match_shapes_i1(int argc, VALUE *argv, VALUE self) * * Compares two shapes(self and object). object should be CvMat or CvContour. * - * A ~ object1, B - object2): + * A - object1, B - object2: * I2(A,B)=sumi=1..7abs(mAi - mBi) */ VALUE rb_match_shapes_i2(int argc, VALUE *argv, VALUE self) { - VALUE object; - rb_scan_args(argc, argv, "10", &object); - if ((!(rb_obj_is_kind_of(object, cCvMat::rb_class()))) && (!(rb_obj_is_kind_of(object, cCvContour::rb_class())))) - rb_raise(rb_eTypeError, "argument 1 (shape) should be %s or %s", rb_class2name(cCvMat::rb_class()), rb_class2name(cCvContour::rb_class())); - return rb_float_new(cvMatchShapes(CVARR(self), CVARR(object), CV_CONTOURS_MATCH_I2)); + return rb_match_shapes_internal(argc, argv, self, CV_CONTOURS_MATCH_I2); } /* @@ -4709,17 +4739,13 @@ rb_match_shapes_i2(int argc, VALUE *argv, VALUE self) * * Compares two shapes(self and object). object should be CvMat or CvContour. * - * A ~ object1, B - object2): + * A - object1, B - object2: * I3(A,B)=sumi=1..7abs(mAi - mBi)/abs(mAi) */ VALUE rb_match_shapes_i3(int argc, VALUE *argv, VALUE self) { - VALUE object; - rb_scan_args(argc, argv, "10", &object); - if ((!(rb_obj_is_kind_of(object, cCvMat::rb_class()))) && (!(rb_obj_is_kind_of(object, cCvContour::rb_class())))) - rb_raise(rb_eTypeError, "argument 1 (shape) should be %s or %s", rb_class2name(cCvMat::rb_class()), rb_class2name(cCvContour::rb_class())); - return rb_float_new(cvMatchShapes(CVARR(self), CVARR(object), CV_CONTOURS_MATCH_I3)); + return rb_match_shapes_internal(argc, argv, self, CV_CONTOURS_MATCH_I3); } diff --git a/ext/cvmat.h b/ext/cvmat.h index 4b58560..e1b5f6a 100644 --- a/ext/cvmat.h +++ b/ext/cvmat.h @@ -242,6 +242,7 @@ VALUE rb_inpaint_telea(VALUE self, VALUE mask, VALUE radius); VALUE rb_equalize_hist(VALUE self); /* Matching*/ VALUE rb_match_template(int argc, VALUE *argv, VALUE self); +VALUE rb_match_shapes(int argc, VALUE *argv, VALUE self); VALUE rb_match_shapes_i1(int argc, VALUE *argv, VALUE self); VALUE rb_match_shapes_i2(int argc, VALUE *argv, VALUE self); VALUE rb_match_shapes_i3(int argc, VALUE *argv, VALUE self); diff --git a/ext/opencv.cpp b/ext/opencv.cpp index 99cf64b..d3bf096 100644 --- a/ext/opencv.cpp +++ b/ext/opencv.cpp @@ -251,6 +251,11 @@ define_ruby_module() 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)); + + /* Comparison method */ + rb_define_const(rb_module, "CV_CONTOURS_MATCH_I1", INT2FIX(CV_CONTOURS_MATCH_I1)); + rb_define_const(rb_module, "CV_CONTOURS_MATCH_I2", INT2FIX(CV_CONTOURS_MATCH_I2)); + rb_define_const(rb_module, "CV_CONTOURS_MATCH_I3", INT2FIX(CV_CONTOURS_MATCH_I3)); VALUE inversion_method = rb_hash_new(); /* {:lu, :svd, :svd_sym(:svd_symmetric)}: Inversion method */ @@ -388,6 +393,13 @@ define_ruby_module() RESIST_CVMETHOD(inpaint_method, "ns", CV_INPAINT_NS); RESIST_CVMETHOD(inpaint_method, "telea", CV_INPAINT_TELEA); + VALUE comparison_method = rb_hash_new(); + /* Comparison method */ + rb_define_const(rb_module, "COMPARISON_METHOD", comparison_method); + RESIST_CVMETHOD(comparison_method, "i1", CV_CONTOURS_MATCH_I1); + RESIST_CVMETHOD(comparison_method, "i2", CV_CONTOURS_MATCH_I2); + RESIST_CVMETHOD(comparison_method, "i3", CV_CONTOURS_MATCH_I3); + /* color convert methods */ rb_define_module_function(rb_module, "BGR2BGRA", RUBY_METHOD_FUNC(rb_BGR2BGRA), 1); rb_define_module_function(rb_module, "RGB2RGBA", RUBY_METHOD_FUNC(rb_RGB2RGBA), 1); diff --git a/test/samples/str-cv-rotated.jpg b/test/samples/str-cv-rotated.jpg new file mode 100644 index 0000000000000000000000000000000000000000..e2ca43e477b2e5a69d38ff0ce70b7abe6fe4b48b GIT binary patch literal 2329 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 CvColor::Black, :thickness => 3) # snap mat, templ, result end + + def test_match_shapes + mat_cv = CvMat.load(FILENAME_STR_CV, CV_LOAD_IMAGE_GRAYSCALE) + mat_ov = CvMat.load(FILENAME_STR_OV, CV_LOAD_IMAGE_GRAYSCALE) + mat_cv_rotated = CvMat.load(FILENAME_STR_CV_ROTATED, CV_LOAD_IMAGE_GRAYSCALE) + + [CV_CONTOURS_MATCH_I1, :i1].each { |method| + assert_in_delta(0, mat_cv.match_shapes(mat_cv_rotated, method), 0.00001) + assert_in_delta(0.0010649, mat_cv.match_shapes(mat_ov, method), 0.00001) + } + + [CV_CONTOURS_MATCH_I2, :i2].each { |method| + assert_in_delta(0, mat_cv.match_shapes(mat_cv_rotated, method), 0.00001) + assert_in_delta(0.0104650, mat_cv.match_shapes(mat_ov, method), 0.00001) + } + + [CV_CONTOURS_MATCH_I3, :i3].each { |method| + assert_in_delta(0, mat_cv.match_shapes(mat_cv_rotated, method), 0.00001) + assert_in_delta(0.0033327, mat_cv.match_shapes(mat_ov, method), 0.00001) + } + end + + def test_match_shapes_i1 + mat_cv = CvMat.load(FILENAME_STR_CV, CV_LOAD_IMAGE_GRAYSCALE) + mat_ov = CvMat.load(FILENAME_STR_OV, CV_LOAD_IMAGE_GRAYSCALE) + mat_cv_rotated = CvMat.load(FILENAME_STR_CV_ROTATED, CV_LOAD_IMAGE_GRAYSCALE) + + assert_in_delta(0, mat_cv.match_shapes_i1(mat_cv_rotated), 0.00001) + assert_in_delta(0.0010649, mat_cv.match_shapes_i1(mat_ov), 0.00001) + end + + def test_match_shapes_i2 + mat_cv = CvMat.load(FILENAME_STR_CV, CV_LOAD_IMAGE_GRAYSCALE) + mat_ov = CvMat.load(FILENAME_STR_OV, CV_LOAD_IMAGE_GRAYSCALE) + mat_cv_rotated = CvMat.load(FILENAME_STR_CV_ROTATED, CV_LOAD_IMAGE_GRAYSCALE) + + assert_in_delta(0, mat_cv.match_shapes_i2(mat_cv_rotated), 0.00001) + assert_in_delta(0.0104650, mat_cv.match_shapes_i2(mat_ov), 0.00001) + end + + def test_match_shapes_i3 + mat_cv = CvMat.load(FILENAME_STR_CV, CV_LOAD_IMAGE_GRAYSCALE) + mat_ov = CvMat.load(FILENAME_STR_OV, CV_LOAD_IMAGE_GRAYSCALE) + mat_cv_rotated = CvMat.load(FILENAME_STR_CV_ROTATED, CV_LOAD_IMAGE_GRAYSCALE) + + assert_in_delta(0, mat_cv.match_shapes_i3(mat_cv_rotated), 0.00001) + assert_in_delta(0.0033327, mat_cv.match_shapes_i3(mat_ov), 0.00001) + end end diff --git a/test/test_opencv.rb b/test/test_opencv.rb index 4567e83..9f65783 100755 --- a/test/test_opencv.rb +++ b/test/test_opencv.rb @@ -88,6 +88,11 @@ class TestOpenCV < OpenCVTestCase assert_equal(3, CV_TM_CCORR_NORMED) assert_equal(4, CV_TM_CCOEFF) assert_equal(5, CV_TM_CCOEFF_NORMED) + + # Comparison method + assert_equal(1, CV_CONTOURS_MATCH_I1) + assert_equal(2, CV_CONTOURS_MATCH_I2) + assert_equal(3, CV_CONTOURS_MATCH_I3) end def test_symbols @@ -192,6 +197,11 @@ class TestOpenCV < OpenCVTestCase # Inpaint method assert_equal(0, INPAINT_METHOD[:ns]) assert_equal(1, INPAINT_METHOD[:telea]) + + # Comparison method + assert_equal(1, COMPARISON_METHOD[:i1]) + assert_equal(2, COMPARISON_METHOD[:i2]) + assert_equal(3, COMPARISON_METHOD[:i3]) end def test_cvt_color_funcs