1
0
Fork 0
mirror of https://github.com/ruby-opencv/ruby-opencv synced 2023-03-27 23:22:12 -04:00

refactored some functions to get options

This commit is contained in:
ser1zw 2011-10-31 03:28:06 +09:00
parent 1d1244de0c
commit cd3cd06829
10 changed files with 98 additions and 63 deletions

View file

@ -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;

View file

@ -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);

View file

@ -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()
{

View file

@ -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();

View file

@ -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()
{

View file

@ -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);
}

View file

@ -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);

View file

@ -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)) {

View file

@ -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)

View file

@ -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))