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:
parent
49d44dcdb8
commit
7fc0732b7f
3 changed files with 76 additions and 37 deletions
|
@ -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;
|
||||
}
|
||||
|
|
70
ext/opencv.h
70
ext/opencv.h
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue