diff --git a/ext/opencv/cvchain.cpp b/ext/opencv/cvchain.cpp index ecf6704..a80372c 100644 --- a/ext/opencv/cvchain.cpp +++ b/ext/opencv/cvchain.cpp @@ -17,11 +17,11 @@ __NAMESPACE_BEGIN_OPENCV __NAMESPACE_BEGIN_CVCHAIN -#define APPROX_CHAIN_OPTION(op) NIL_P(op) ? rb_const_get(rb_class(), rb_intern("APPROX_CHAIN_OPTION")) : rb_funcall(rb_const_get(rb_class(), rb_intern("APPROX_CHAIN_OPTION")), rb_intern("merge"), 1, op) -#define APPROX_CHAIN_METHOD(op) CVMETHOD("APPROX_CHAIN_METHOD", rb_hash_aref(op, ID2SYM(rb_intern("method"))), CV_CHAIN_APPROX_SIMPLE) -#define APPROX_CHAIN_PARAMETER(op) NUM2INT(rb_hash_aref(op, ID2SYM(rb_intern("parameter")))) -#define APPROX_CHAIN_MINIMAL_PARAMETER(op) NUM2INT(rb_hash_aref(op, ID2SYM(rb_intern("minimal_parameter")))) -#define APPROX_CHAIN_RECURSIVE(op) ({VALUE _recursive = rb_hash_aref(op, ID2SYM(rb_intern("recursive"))); NIL_P(_recursive) ? 0 : _recursive == Qfalse ? 0 : 1;}) +#define APPROX_CHAIN_OPTION(op) rb_get_option_table(rb_klass, "APPROX_CHAIN_OPTION", op) +#define APPROX_CHAIN_METHOD(op) CVMETHOD("APPROX_CHAIN_METHOD", LOOKUP_CVMETHOD(op, "method"), CV_CHAIN_APPROX_SIMPLE) +#define APPROX_CHAIN_PARAMETER(op) NUM2INT(LOOKUP_CVMETHOD(op, "parameter")) +#define APPROX_CHAIN_MINIMAL_PARAMETER(op) NUM2INT(LOOKUP_CVMETHOD(op, "minimal_parameter")) +#define APPROX_CHAIN_RECURSIVE(op) TRUE_OR_FALSE(LOOKUP_CVMETHOD(op, "recursive")) VALUE rb_klass; diff --git a/ext/opencv/cvcontour.cpp b/ext/opencv/cvcontour.cpp index 48c0c86..0b21c36 100644 --- a/ext/opencv/cvcontour.cpp +++ b/ext/opencv/cvcontour.cpp @@ -17,10 +17,10 @@ __NAMESPACE_BEGIN_OPENCV __NAMESPACE_BEGIN_CVCONTOUR -#define APPROX_POLY_OPTION(op) NIL_P(op) ? rb_const_get(rb_class(), rb_intern("APPROX_OPTION")) : rb_funcall(rb_const_get(rb_class(), rb_intern("APPROX_OPTION")), rb_intern("merge"), 1, op) -#define APPROX_POLY_METHOD(op) CVMETHOD("APPROX_POLY_METHOD", rb_hash_aref(op, ID2SYM(rb_intern("method"))), CV_POLY_APPROX_DP) -#define APPROX_POLY_ACCURACY(op) NUM2DBL(rb_hash_aref(op, ID2SYM(rb_intern("accuracy")))) -#define APPROX_POLY_RECURSIVE(op) ({VALUE _recursive = rb_hash_aref(op, ID2SYM(rb_intern("recursive"))); NIL_P(_recursive) ? 0 : _recursive == Qfalse ? 0 : 1;}) +#define APPROX_POLY_OPTION(op) rb_get_option_table(rb_klass, "APPROX_OPTION", op) +#define APPROX_POLY_METHOD(op) CVMETHOD("APPROX_POLY_METHOD", LOOKUP_CVMETHOD(op, "method"), CV_POLY_APPROX_DP) +#define APPROX_POLY_ACCURACY(op) NUM2DBL(LOOKUP_CVMETHOD(op, "accuracy")) +#define APPROX_POLY_RECURSIVE(op) TRUE_OR_FALSE(LOOKUP_CVMETHOD(op, "recursive")) VALUE rb_allocate(VALUE klass); void cvcontour_free(void *ptr); diff --git a/ext/opencv/cvfont.cpp b/ext/opencv/cvfont.cpp index 2ea4b8d..1437967 100644 --- a/ext/opencv/cvfont.cpp +++ b/ext/opencv/cvfont.cpp @@ -20,6 +20,19 @@ __NAMESPACE_BEGIN_CVFONT VALUE rb_klass; +int +rb_font_option_line_type(VALUE font_option) +{ + VALUE line_type = LOOKUP_CVMETHOD(font_option, "line_type"); + if (FIXNUM_P(line_type)) { + return FIX2INT(line_type); + } + else if (line_type == ID2SYM(rb_intern("aa"))) { + return CV_AA; + } + return 0; +} + VALUE rb_class() { diff --git a/ext/opencv/cvfont.h b/ext/opencv/cvfont.h index 0eaf1cf..330ab6a 100644 --- a/ext/opencv/cvfont.h +++ b/ext/opencv/cvfont.h @@ -18,14 +18,13 @@ __NAMESPACE_BEGIN_OPENCV __NAMESPACE_BEGIN_CVFONT -#define FONT_OPTION(op) NIL_P(op) ? rb_const_get(rb_class(), rb_intern("FONT_OPTION")) : rb_funcall(rb_const_get(rb_class(), rb_intern("FONT_OPTION")), rb_intern("merge"), 1, font_option) -#define FO_ITALIC(op) ({VALUE _italic = rb_hash_aref(op, ID2SYM(rb_intern("italic"))); NIL_P(_italic) ? 0 : _italic == Qfalse ? 0 : CV_FONT_ITALIC;}) -#define FO_HSCALE(op) NUM2DBL(rb_hash_aref(op, ID2SYM(rb_intern("hscale")))) -#define FO_VSCALE(op) NUM2DBL(rb_hash_aref(op, ID2SYM(rb_intern("vscale")))) -#define FO_SHEAR(op) NUM2DBL(rb_hash_aref(op, ID2SYM(rb_intern("shear")))) -#define FO_THICKNESS(op) FIX2INT(rb_hash_aref(op, ID2SYM(rb_intern("thickness")))) -#define FO_LINE_TYPE(op) FIX2INT(rb_hash_aref(op, ID2SYM(rb_intern("line_type")))) - +#define FONT_OPTION(op) rb_get_option_table(rb_klass, "FONT_OPTION", op) +#define FO_ITALIC(op) TRUE_OR_FALSE(LOOKUP_CVMETHOD(op, "italic")) +#define FO_HSCALE(op) NUM2DBL(LOOKUP_CVMETHOD(op, "hscale")) +#define FO_VSCALE(op) NUM2DBL(LOOKUP_CVMETHOD(op, "vscale")) +#define FO_SHEAR(op) NUM2DBL(LOOKUP_CVMETHOD(op, "shear")) +#define FO_THICKNESS(op) NUM2INT(LOOKUP_CVMETHOD(op, "thickness")) +#define FO_LINE_TYPE(op) rb_font_option_line_type(op) VALUE rb_class(); diff --git a/ext/opencv/cvmat.cpp b/ext/opencv/cvmat.cpp index 07cf744..05e8cf2 100644 --- a/ext/opencv/cvmat.cpp +++ b/ext/opencv/cvmat.cpp @@ -45,46 +45,59 @@ __NAMESPACE_BEGIN_OPENCV __NAMESPACE_BEGIN_CVMAT -#define DRAWING_OPTION(op) NIL_P(op) ? rb_const_get(rb_class(), rb_intern("DRAWING_OPTION")) : rb_funcall(rb_const_get(rb_class(), rb_intern("DRAWING_OPTION")), rb_intern("merge"), 1, op) -#define DO_COLOR(op) VALUE_TO_CVSCALAR(rb_hash_aref(op, ID2SYM(rb_intern("color")))) -#define DO_THICKNESS(op) FIX2INT(rb_hash_aref(op, ID2SYM(rb_intern("thickness")))) -#define DO_LINE_TYPE(op) (FIXNUM_P(op) ? FIX2INT(rb_hash_aref(op, ID2SYM(rb_intern("line_type")))) : CV_AA) // Quick fix -#define DO_SHIFT(op) FIX2INT(rb_hash_aref(op, ID2SYM(rb_intern("shift")))) -#define DO_IS_CLOSED(op) ({VALUE _is_closed = rb_hash_aref(op, ID2SYM(rb_intern("is_closed"))); NIL_P(_is_closed) ? 0 : _is_closed == Qfalse ? 0 : 1;}) +#define DRAWING_OPTION(opt) rb_get_option_table(rb_klass, "DRAWING_OPTION", opt) +#define DO_COLOR(opt) VALUE_TO_CVSCALAR(LOOKUP_CVMETHOD(opt, "color")) +#define DO_THICKNESS(opt) NUM2INT(LOOKUP_CVMETHOD(opt, "thickness")) +#define DO_LINE_TYPE(opt) rb_drawing_option_line_type(opt) +#define DO_SHIFT(opt) NUM2INT(LOOKUP_CVMETHOD(opt, "shift")) +#define DO_IS_CLOSED(opt) TRUE_OR_FALSE(LOOKUP_CVMETHOD(opt, "is_closed")) -#define GOOD_FEATURES_TO_TRACK_OPTION(op) NIL_P(op) ? rb_const_get(rb_class(), rb_intern("GOOD_FEATURES_TO_TRACK_OPTION")) : rb_funcall(rb_const_get(rb_class(), rb_intern("GOOD_FEATURES_TO_TRACK_OPTION")), rb_intern("merge"), 1, op) -#define GF_MAX(op) NUM2INT(rb_hash_aref(op, ID2SYM(rb_intern("max")))) -#define GF_MASK(op) MASK(rb_hash_aref(op, ID2SYM(rb_intern("mask")))) -#define GF_BLOCK_SIZE(op) NUM2INT(rb_hash_aref(op, ID2SYM(rb_intern("block_size")))) -#define GF_USE_HARRIS(op) TRUE_OR_FALSE(rb_hash_aref(op, ID2SYM(rb_intern("use_harris"))), 0) -#define GF_K(op) NUM2DBL(rb_hash_aref(op, ID2SYM(rb_intern("k")))) +#define GOOD_FEATURES_TO_TRACK_OPTION(opt) rb_get_option_table(rb_klass, "GOOD_FEATURES_TO_TRACK_OPTION", opt) +#define GF_MAX(opt) NUM2INT(LOOKUP_CVMETHOD(opt, "max")) +#define GF_MASK(opt) MASK(LOOKUP_CVMETHOD(opt, "mask")) +#define GF_BLOCK_SIZE(opt) NUM2INT(LOOKUP_CVMETHOD(opt, "block_size")) +#define GF_USE_HARRIS(opt) TRUE_OR_FALSE(LOOKUP_CVMETHOD(opt, "use_harris")) +#define GF_K(opt) NUM2DBL(LOOKUP_CVMETHOD(opt, "k")) -#define FLOOD_FILL_OPTION(op) NIL_P(op) ? rb_const_get(rb_class(), rb_intern("FLOOD_FILL_OPTION")) : rb_funcall(rb_const_get(rb_class(), rb_intern("FLOOD_FILL_OPTION")), rb_intern("merge"), 1, op) -#define FF_CONNECTIVITY(op) NUM2INT(rb_hash_aref(op, ID2SYM(rb_intern("connectivity")))) -#define FF_FIXED_RANGE(op) TRUE_OR_FALSE(rb_hash_aref(op, ID2SYM(rb_intern("fixed_range"))), 0) -#define FF_MASK_ONLY(op) TRUE_OR_FALSE(rb_hash_aref(op, ID2SYM(rb_intern("mask_only"))), 0) +#define FLOOD_FILL_OPTION(opt) rb_get_option_table(rb_klass, "FLOOD_FILL_OPTION", opt) +#define FF_CONNECTIVITY(opt) NUM2INT(LOOKUP_CVMETHOD(opt, "connectivity")) +#define FF_FIXED_RANGE(opt) TRUE_OR_FALSE(LOOKUP_CVMETHOD(opt, "fixed_range")) +#define FF_MASK_ONLY(opt) TRUE_OR_FALSE(LOOKUP_CVMETHOD(opt, "mask_only")) -#define FIND_CONTOURS_OPTION(op) NIL_P(op) ? rb_const_get(rb_class(), rb_intern("FIND_CONTOURS_OPTION")) : rb_funcall(rb_const_get(rb_class(), rb_intern("FIND_CONTOURS_OPTION")), rb_intern("merge"), 1, op) -#define FC_MODE(op) FIX2INT(rb_hash_aref(op, ID2SYM(rb_intern("mode")))) -#define FC_METHOD(op) FIX2INT(rb_hash_aref(op, ID2SYM(rb_intern("method")))) -#define FC_OFFSET(op)VALUE_TO_CVPOINT(rb_hash_aref(op, ID2SYM(rb_intern("offset")))) +#define FIND_CONTOURS_OPTION(opt) rb_get_option_table(rb_klass, "FIND_CONTOURS_OPTION", opt) +#define FC_MODE(opt) NUM2INT(LOOKUP_CVMETHOD(opt, "mode")) +#define FC_METHOD(opt) NUM2INT(LOOKUP_CVMETHOD(opt, "method")) +#define FC_OFFSET(opt) VALUE_TO_CVPOINT(LOOKUP_CVMETHOD(opt, "offset")) -#define OPTICAL_FLOW_HS_OPTION(op) NIL_P(op) ? rb_const_get(rb_class(), rb_intern("OPTICAL_FLOW_HS_OPTION")) : rb_funcall(rb_const_get(rb_class(), rb_intern("OPTICAL_FLOW_HS_OPTION")), rb_intern("merge"), 1, op) -#define HS_LAMBDA(op) NUM2DBL(rb_hash_aref(op, ID2SYM(rb_intern("lambda")))) -#define HS_CRITERIA(op) VALUE_TO_CVTERMCRITERIA(rb_hash_aref(op, ID2SYM(rb_intern("criteria")))) +#define OPTICAL_FLOW_HS_OPTION(opt) rb_get_option_table(rb_klass, "OPTICAL_FLOW_HS_OPTION", opt) +#define HS_LAMBDA(opt) NUM2DBL(LOOKUP_CVMETHOD(opt, "lambda")) +#define HS_CRITERIA(opt) VALUE_TO_CVTERMCRITERIA(LOOKUP_CVMETHOD(opt, "criteria")) -#define OPTICAL_FLOW_BM_OPTION(op) NIL_P(op) ? rb_const_get(rb_class(), rb_intern("OPTICAL_FLOW_BM_OPTION")) : rb_funcall(rb_const_get(rb_class(), rb_intern("OPTICAL_FLOW_BM_OPTION")), rb_intern("merge"), 1, op) -#define BM_BLOCK_SIZE(op) VALUE_TO_CVSIZE(rb_hash_aref(op, ID2SYM(rb_intern("block_size")))) -#define BM_SHIFT_SIZE(op) VALUE_TO_CVSIZE(rb_hash_aref(op, ID2SYM(rb_intern("shift_size")))) -#define BM_MAX_RANGE(op) VALUE_TO_CVSIZE(rb_hash_aref(op, ID2SYM(rb_intern("max_range")))) +#define OPTICAL_FLOW_BM_OPTION(opt) rb_get_option_table(rb_klass, "OPTICAL_FLOW_BM_OPTION", opt) +#define BM_BLOCK_SIZE(opt) VALUE_TO_CVSIZE(LOOKUP_CVMETHOD(opt, "block_size")) +#define BM_SHIFT_SIZE(opt) VALUE_TO_CVSIZE(LOOKUP_CVMETHOD(opt, "shift_size")) +#define BM_MAX_RANGE(opt) VALUE_TO_CVSIZE(LOOKUP_CVMETHOD(opt, "max_range")) -#define FIND_FUNDAMENTAL_MAT_OPTION(op) NIL_P(op) ? rb_const_get(rb_class(), rb_intern("FIND_FUNDAMENTAL_MAT_OPTION")) : rb_funcall(rb_const_get(rb_class(), rb_intern("FIND_FUNDAMENTAL_MAT_OPTION")), rb_intern("merge"), 1, op) -#define FFM_WITH_STATUS(op) TRUE_OR_FALSE(rb_hash_aref(op, ID2SYM(rb_intern("with_status"))), 0) -#define FFM_MAXIMUM_DISTANCE(op) NUM2DBL(rb_hash_aref(op, ID2SYM(rb_intern("maximum_distance")))) -#define FFM_DESIRABLE_LEVEL(op) NUM2DBL(rb_hash_aref(op, ID2SYM(rb_intern("desirable_level")))) +#define FIND_FUNDAMENTAL_MAT_OPTION(opt) rb_get_option_table(rb_klass, "FIND_FUNDAMENTAL_MAT_OPTION", opt) +#define FFM_WITH_STATUS(opt) TRUE_OR_FALSE(LOOKUP_CVMETHOD(opt, "with_status")) +#define FFM_MAXIMUM_DISTANCE(opt) NUM2DBL(LOOKUP_CVMETHOD(opt, "maximum_distance")) +#define FFM_DESIRABLE_LEVEL(opt) NUM2DBL(LOOKUP_CVMETHOD(opt, "desirable_level")) VALUE rb_klass; +int +rb_drawing_option_line_type(VALUE drawing_option) +{ + VALUE line_type = LOOKUP_CVMETHOD(drawing_option, "line_type"); + if (FIXNUM_P(line_type)) { + return FIX2INT(line_type); + } + else if (line_type == ID2SYM(rb_intern("aa"))) { + return CV_AA; + } + return 0; +} + VALUE rb_class() { diff --git a/ext/opencv/cvutils.cpp b/ext/opencv/cvutils.cpp index 9d075d0..c1b6125 100644 --- a/ext/opencv/cvutils.cpp +++ b/ext/opencv/cvutils.cpp @@ -170,3 +170,13 @@ rb_cvCreateMemStorage(int block_size) return ptr; } +VALUE +rb_get_option_table(VALUE klass, const char* table_name, VALUE option) +{ + VALUE table = rb_const_get(klass, rb_intern(table_name)); + if (NIL_P(option)) + return table; + else + return rb_funcall(table, rb_intern("merge"), 1, option); +} + diff --git a/ext/opencv/cvutils.h b/ext/opencv/cvutils.h index 73bae0f..cfd75e6 100644 --- a/ext/opencv/cvutils.h +++ b/ext/opencv/cvutils.h @@ -23,4 +23,5 @@ CvMat* rb_cvCreateMat(int height, int width, int type); IplImage* rb_cvCreateImage(CvSize size, int depth, int channels); IplConvKernel* rb_cvCreateStructuringElementEx(int cols, int rows, int anchorX, int anchorY, int shape, int *values); CvMemStorage* rb_cvCreateMemStorage(int block_size); +VALUE rb_get_option_table(VALUE klass, const char* table_name, VALUE option); diff --git a/ext/opencv/opencv.h b/ext/opencv/opencv.h index ca6ab07..62e1f6b 100644 --- a/ext/opencv/opencv.h +++ b/ext/opencv/opencv.h @@ -257,7 +257,7 @@ CVMETHOD(const char *name, VALUE method, int ifnone = 0) } inline int -TRUE_OR_FALSE(VALUE object, int ifnone) +TRUE_OR_FALSE(VALUE object, int ifnone = 0) { int value = ifnone; switch (TYPE(object)) { diff --git a/test/test_cvfont.rb b/test/test_cvfont.rb index e4473d3..dc85afc 100755 --- a/test/test_cvfont.rb +++ b/test/test_cvfont.rb @@ -34,7 +34,7 @@ class TestCvFont < OpenCVTestCase assert_equal(0, font.shear) assert_equal(1, font.thickness) assert_equal(8, font.line_type) - assert(!font.italic) + assert_false(font.italic) font = CvFont.new(:plain, :hscale => 2.5, :vscale => 3.5, :shear => 0.5, :thickness => 3, :line_type => 2, :italic => false) @@ -44,7 +44,7 @@ class TestCvFont < OpenCVTestCase assert_equal(0.5, font.shear) assert_equal(3, font.thickness) assert_equal(2, font.line_type) - assert(!font.italic) + assert_false(font.italic) font = CvFont.new(:simplex, :italic => true) assert_equal(16, font.face) diff --git a/test/test_cvmat_imageprocessing.rb b/test/test_cvmat_imageprocessing.rb index 43f7b70..95e6a57 100755 --- a/test/test_cvmat_imageprocessing.rb +++ b/test/test_cvmat_imageprocessing.rb @@ -116,8 +116,8 @@ class TestCvMat_imageprocessing < OpenCVTestCase mat2 = mat0.pre_corner_detect(3) mat3 = mat0.pre_corner_detect(5) - assert_equal('fe7c8a1d07a3dd0fb6a02d6a6de0fe9f', hash_img(mat1)) - assert_equal('fe7c8a1d07a3dd0fb6a02d6a6de0fe9f', hash_img(mat2)) + assert_equal('1ec909dfa2e497c7f454e39aefd764f5', hash_img(mat1)) + assert_equal('1ec909dfa2e497c7f454e39aefd764f5', hash_img(mat2)) assert_equal('42e7443ffd389d15343d3c6bdc42f553', hash_img(mat3)) # Uncomment the following lines to show the images @@ -166,11 +166,10 @@ class TestCvMat_imageprocessing < OpenCVTestCase mat3 = mat0.corner_harris(3, 3, 0.04) mat4 = mat0.corner_harris(3, 7, 0.01) - assert_equal('6ceb54b54cc98a72de7cb75649fb0a12', hash_img(mat1)) - assert_equal('6ceb54b54cc98a72de7cb75649fb0a12', hash_img(mat2)) - assert_equal('6ceb54b54cc98a72de7cb75649fb0a12', hash_img(mat3)) - # assert_equal('4e703deb9a418bbf37e3283f4a7d4d32', hash_img(mat4)) - assert_equal('d689b19c786c5693da7282ab9fdb7921', hash_img(mat4)) + assert_equal('fbb4e04c86f906c83fe17fd148675f90', hash_img(mat1)) + assert_equal('fbb4e04c86f906c83fe17fd148675f90', hash_img(mat2)) + assert_equal('fbb4e04c86f906c83fe17fd148675f90', hash_img(mat3)) + assert_equal('6515d75f6223806f077cebc7b3927a13', hash_img(mat4)) # Uncomment the following lines to show the images # snap(['original', mat0], ['corner_harris(3)', mat1], ['corner_harris(3,3)', mat2], @@ -342,7 +341,7 @@ class TestCvMat_imageprocessing < OpenCVTestCase assert_equal('b2203ccca2c17b042a90b79704c0f535', hash_img(mat1)) assert_equal('b2203ccca2c17b042a90b79704c0f535', hash_img(mat2)) assert_equal('ba8f2dee2329aaa6309de4770fc8fa55', hash_img(mat3)) - assert_equal('8a28a2748b0cfc87205d65c625187867', hash_img(mat4)) + assert_equal('10cf18adaa8548101cc230206624133a', hash_img(mat4)) assert_equal('de5c30fcd9e817aa282ab05388de995b', hash_img(mat5)) assert_raise(TypeError) { @@ -1752,12 +1751,12 @@ class TestCvMat_imageprocessing < OpenCVTestCase } velx, vely = curr.optical_flow_lk(prev, CvSize.new(3, 3)) - assert_equal('bea0c4c2b4b89ed1bb5e9ef5b68b8759', hash_img(velx)) - assert_equal('aa643584d4eb175ab48896ff44646e06', hash_img(vely)) + assert_equal('13333362f0daf6ad732006bd2a32e177', hash_img(velx)) + assert_equal('45dc42034ab606dd61e34a5adc6a1c1b', hash_img(vely)) velx, vely = curr.optical_flow_lk(prev, CvSize.new(5, 5)) - assert_equal('00d5889a8e62f7c5fc695ba3556cc374', hash_img(velx)) - assert_equal('e7524c292e95e374fdb588f0b516938e', hash_img(vely)) + assert_equal('d83c57805f9c074d0ad33a7522a75952', hash_img(velx)) + assert_equal('df8fb2010b00d89090e7d9653781a68d', hash_img(vely)) assert_raise(TypeError) { curr.optical_flow_lk(DUMMY_OBJ, CvSize.new(3, 3))