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

fixed a bug of CvMat#convert_scale, and added some tests

This commit is contained in:
ser1zw 2011-01-02 05:51:53 +09:00
parent 49d44dcdb8
commit 7fc0732b7f
3 changed files with 76 additions and 37 deletions

View file

@ -1587,7 +1587,7 @@ rb_convert_scale(VALUE self, VALUE hash)
VALUE depth = rb_hash_aref(hash, ID2SYM(rb_intern("depth"))),
scale = rb_hash_aref(hash, ID2SYM(rb_intern("scale"))),
shift = rb_hash_aref(hash, ID2SYM(rb_intern("shift"))),
dest = new_object(cvGetSize(CVARR(self)), CV_MAKETYPE(IF_DEPTH(depth, CV_MAT_DEPTH(CVMAT(self)->type)), CV_MAT_CN(CVMAT(self)->type)));
dest = new_object(cvGetSize(CVARR(self)), CV_MAKETYPE(CVMETHOD("DEPTH", depth, CV_MAT_DEPTH(CVMAT(self)->type)), CV_MAT_CN(CVMAT(self)->type)));
cvConvertScale(CVARR(self), CVARR(dest), IF_DBL(scale, 1.0), IF_DBL(shift, 0.0));
return dest;
}

View file

@ -6,7 +6,7 @@
Copyright (C) 2005-2007 Masakazu Yonekura
************************************************************/
************************************************************/
#ifndef RUBY_OPENCV_H
#define RUBY_OPENCV_H
@ -233,18 +233,18 @@ CVMETHOD(const char *name, VALUE method, int ifnone = 0)
return ifnone;
case T_FIXNUM:
return FIX2INT(method);
case T_STRING:
method = rb_str_intern(method);
case T_SYMBOL:
value = rb_hash_aref(rb_const_get(rb_module_opencv(), rb_intern(name)), method);
if(NIL_P(value)){
rb_warn("invalid opencv method type (see OpenCV::%s)", name);
return ifnone;
}else{
return FIX2INT(value);
}if (rb_obj_is_kind_of(value, rb_cNumeric))
default:
rb_raise(rb_eTypeError, "");
case T_STRING:
method = rb_str_intern(method);
case T_SYMBOL:
value = rb_hash_aref(rb_const_get(rb_module_opencv(), rb_intern(name)), method);
if(NIL_P(value)){
rb_warn("invalid opencv method type (see OpenCV::%s)", name);
return ifnone;
}else{
return FIX2INT(value);
}if (rb_obj_is_kind_of(value, rb_cNumeric))
default:
rb_raise(rb_eTypeError, "");
}
return 0;
}
@ -350,48 +350,48 @@ extract_options_from_args_bang(VALUE ary)
}
/*
inline VALUE
assert_valid_keys(VALUE keys, VALUE valid_keys)
{
inline VALUE
assert_valid_keys(VALUE keys, VALUE valid_keys)
{
VALUE unknown_keys = rb_funcall(keys, rb_intern("-"), 1, rb_funcall(valid_keys, rb_intern("flatten"), 0));
if (NUM2INT(rb_funcall(unknown_keys, rb_intern("empty?"), 0)) != 0){
rb_raise(rb_eArgError, "Unknown key(s): %s",
RSTRING_PTR(rb_funcall(unknown_keys, rb_intern("join"), 1, rb_str_new2(", "))));
rb_raise(rb_eArgError, "Unknown key(s): %s",
RSTRING_PTR(rb_funcall(unknown_keys, rb_intern("join"), 1, rb_str_new2(", "))));
}
return Qnil;
}
}
*/
/*
inline void
assert_valid_keys(VALUE options, int n, ...){
/*
inline void
assert_valid_keys(VALUE options, int n, ...){
va_list valid_keys;
if (!(n > 0)) {return;}
VALUE unknown_keys = rb_funcall(options, rb_intern("keys"), 0);
va_start(valid_keys, n);
for (int i = 0; i < n; i++)
rb_ary_delete(unknown_keys, ID2SYM(rb_intern(va_arg(valid_keys, char*))));
rb_ary_delete(unknown_keys, ID2SYM(rb_intern(va_arg(valid_keys, char*))));
if (RARRAY_LEN(unknown_keys) > 0)
rb_raise(rb_eArgError, "Unknown key(s): %s",
RSTRING_PTR(rb_funcall(unknown_keys, rb_intern("join"), 1, rb_str_new2(", "))));
rb_raise(rb_eArgError, "Unknown key(s): %s",
RSTRING_PTR(rb_funcall(unknown_keys, rb_intern("join"), 1, rb_str_new2(", "))));
va_end(valid_keys);
}
}
inline VALUE
validate_option(VALUE options, const *char key, char *ifnone, int n, ...){
inline VALUE
validate_option(VALUE options, const *char key, char *ifnone, int n, ...){
va_list valid_values;
VALUE value = rb_hash_aref(options, ID2SYM(rb_intern(key)));
if (!value || !(n > 0)) {return ifnone;}
va_start(valid_values, n);
for (int i = 0; i < n; i++){
if (!strcmp(StringValueCStr(value), va_arg(valid_values, char*))){
rb_warn("Option :%s value :%s does not defined. Default value :%s is used.", StringValueCStr(value), );
return ifnone;
}
if (!strcmp(StringValueCStr(value), va_arg(valid_values, char*))){
rb_warn("Option :%s value :%s does not defined. Default value :%s is used.", StringValueCStr(value), );
return ifnone;
}
}
va_end(valid_values);
return value;
}
}
#define OPTIONS(value, hash, key, default) value = ((value = rb_hash_aref(hash, ID2SYM(rb_intern(key)))) ? value : default)
*/
#define OPTIONS(value, hash, key, default) value = ((value = rb_hash_aref(hash, ID2SYM(rb_intern(key)))) ? value : default)
*/
#endif // RUBY_OPENCV_H

View file

@ -720,7 +720,46 @@ class TestCvMat < OpenCVTestCase
end
def test_lut
m0 = create_cvmat(2, 3, :cv8u, 3)
lut_mat = create_cvmat(1, 256, :cv8u, 3) { |j, i, c|
CvScalar.new(255 - c, 255 - c, 255 - c)
}
m = m0.lut(lut_mat)
assert_equal(m0.height, m.height)
assert_equal(m0.width, m.width)
m0.height.times { |j|
m0.width.times { |i|
r, g, b = m0[i, j].to_ary.map { |c| 255 - c }
assert_cvscalar_equal(CvScalar.new(r, g, b, 0), m[i, j])
}
}
end
def test_convert_scale
m0 = create_cvmat(2, 3, :cv32f, 4) { |j, i, c|
CvScalar.new(-c, -c, -c, -c)
}
m1 = m0.convert_scale(:depth => :cv8u)
m2 = m0.convert_scale(:scale => 1.5)
m3 = m0.convert_scale(:shift => 10.0)
m4 = m0.convert_scale(:depth => CV_16U)
[m1, m2, m3, m4].each { |m|
assert_equal(m0.height, m.height)
assert_equal(m0.width, m.width)
}
m0.height.times { |j|
m0.width.times { |i|
assert_cvscalar_equal(CvScalar.new(0, 0, 0, 0), m1[i, j])
a = m0[i, j].to_ary.map { |x| x * 1.5 }
assert_in_delta(a, m2[i, j], 0.001)
a = m0[i, j].to_ary.map { |x| x + 10.0 }
assert_in_delta(a, m3[i, j], 0.001)
assert_cvscalar_equal(CvScalar.new(0, 0, 0, 0), m4[i, j])
}
}
end
# def test_avg_sdv