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

added type check to some CvMat methods

This commit is contained in:
ser1zw 2011-06-29 02:25:51 +09:00
parent 041f9cc89f
commit 20d71ff11c
5 changed files with 263 additions and 71 deletions

View file

@ -435,8 +435,9 @@ rb_initialize(int argc, VALUE *argv, VALUE self)
VALUE row, column, depth, channel; VALUE row, column, depth, channel;
rb_scan_args(argc, argv, "22", &row, &column, &depth, &channel); rb_scan_args(argc, argv, "22", &row, &column, &depth, &channel);
CvMat *ptr = rb_cvCreateMat(FIX2INT(row), FIX2INT(column), int ch = (argc < 4) ? 3 : NUM2INT(channel);
CV_MAKETYPE(CVMETHOD("DEPTH", depth, CV_8U), argc < 4 ? 3 : FIX2INT(channel))); CvMat *ptr = rb_cvCreateMat(NUM2INT(row), NUM2INT(column),
CV_MAKETYPE(CVMETHOD("DEPTH", depth, CV_8U), ch));
free(DATA_PTR(self)); free(DATA_PTR(self));
DATA_PTR(self) = ptr; DATA_PTR(self) = ptr;
@ -721,11 +722,11 @@ rb_copy(int argc, VALUE *argv, VALUE self)
cvCopy(src, CVMAT(value)); cvCopy(src, CVMAT(value));
return Qnil; return Qnil;
} }
else if (rb_obj_is_kind_of(value, rb_cFixnum)) { else if (FIXNUM_P(value)) {
int n = FIX2INT(value); int n = FIX2INT(value);
if (n > 0) { if (n > 0) {
copied = rb_ary_new2(n); copied = rb_ary_new2(n);
for (int i = 0; i < n; i++) { for (int i = 0; i < n; ++i) {
VALUE tmp = new_mat_kind_object(size, self); VALUE tmp = new_mat_kind_object(size, self);
cvCopy(src, CVMAT(tmp)); cvCopy(src, CVMAT(tmp));
rb_ary_store(copied, i, tmp); rb_ary_store(copied, i, tmp);
@ -962,12 +963,14 @@ VALUE
rb_slice_width(VALUE self, VALUE num) rb_slice_width(VALUE self, VALUE num)
{ {
int n = NUM2INT(num); int n = NUM2INT(num);
if (n < 1) {rb_raise(rb_eArgError, "number of piece should be > 0");} if (n < 1)
rb_raise(rb_eArgError, "number of piece should be > 0");
CvSize size = cvGetSize(CVARR(self)); CvSize size = cvGetSize(CVARR(self));
if (size.width % n != 0) {rb_warn("width does not div correctly.");} if (size.width % n != 0)
rb_warn("width does not div correctly.");
int div_x = size.width / n; int div_x = size.width / n;
VALUE ary = rb_ary_new2(n); VALUE ary = rb_ary_new2(n);
for (int i = 0; i < n; i++) { for (int i = 0; i < n; ++i) {
CvRect rect = { div_x * i, 0, div_x, size.height }; CvRect rect = { div_x * i, 0, div_x, size.height };
rb_ary_push(ary, DEPEND_OBJECT(rb_klass, cvGetSubRect(CVARR(self), RB_CVALLOC(CvMat), rect), self)); rb_ary_push(ary, DEPEND_OBJECT(rb_klass, cvGetSubRect(CVARR(self), RB_CVALLOC(CvMat), rect), self));
} }
@ -987,12 +990,14 @@ VALUE
rb_slice_height(VALUE self, VALUE num) rb_slice_height(VALUE self, VALUE num)
{ {
int n = NUM2INT(num); int n = NUM2INT(num);
if (n < 1) {rb_raise(rb_eArgError, "number of piece should be > 0");} if (n < 1)
rb_raise(rb_eArgError, "number of piece should be > 0");
CvSize size = cvGetSize(CVARR(self)); CvSize size = cvGetSize(CVARR(self));
if (size.height % n != 0) {rb_warn("height does not div correctly.");} if (size.height % n != 0)
rb_warn("height does not div correctly.");
int div_y = size.height / n; int div_y = size.height / n;
VALUE ary = rb_ary_new2(n); VALUE ary = rb_ary_new2(n);
for (int i = 0; i < n; i++) { for (int i = 0; i < n; ++i) {
CvRect rect = { 0, div_y * i, size.width, div_y }; CvRect rect = { 0, div_y * i, size.width, div_y };
rb_ary_push(ary, DEPEND_OBJECT(rb_klass, cvGetSubRect(CVARR(self), RB_CVALLOC(CvMat), rect), self)); rb_ary_push(ary, DEPEND_OBJECT(rb_klass, cvGetSubRect(CVARR(self), RB_CVALLOC(CvMat), rect), self));
} }
@ -1011,13 +1016,15 @@ VALUE
rb_row(VALUE self, VALUE args) rb_row(VALUE self, VALUE args)
{ {
int len = RARRAY_LEN(args); int len = RARRAY_LEN(args);
if (len < 1) {rb_raise(rb_eArgError, "wrong number of argument.(more than 1)");} if (len < 1)
rb_raise(rb_eArgError, "wrong number of argument.(more than 1)");
VALUE ary = rb_ary_new2(len); VALUE ary = rb_ary_new2(len);
for (int i = 0; i < len; i++) { for (int i = 0; i < len; ++i) {
VALUE value = rb_ary_entry(args, i); VALUE value = rb_ary_entry(args, i);
if (FIXNUM_P(value)) { if (FIXNUM_P(value)) {
rb_ary_store(ary, i, DEPEND_OBJECT(rb_klass, cvGetRow(CVARR(self), RB_CVALLOC(CvMat), FIX2INT(value)), self)); rb_ary_store(ary, i, DEPEND_OBJECT(rb_klass, cvGetRow(CVARR(self), RB_CVALLOC(CvMat), FIX2INT(value)), self));
}else{ }
else {
CvSlice slice = VALUE_TO_CVSLICE(value); CvSlice slice = VALUE_TO_CVSLICE(value);
rb_ary_store(ary, i, DEPEND_OBJECT(rb_klass, cvGetRows(CVARR(self), RB_CVALLOC(CvMat), rb_ary_store(ary, i, DEPEND_OBJECT(rb_klass, cvGetRows(CVARR(self), RB_CVALLOC(CvMat),
slice.start_index, slice.end_index), self)); slice.start_index, slice.end_index), self));
@ -1038,13 +1045,15 @@ VALUE
rb_col(VALUE self, VALUE args) rb_col(VALUE self, VALUE args)
{ {
int len = RARRAY_LEN(args); int len = RARRAY_LEN(args);
if (len < 1) {rb_raise(rb_eArgError, "wrong number of argument.(more than 1)");} if (len < 1)
rb_raise(rb_eArgError, "wrong number of argument.(more than 1)");
VALUE ary = rb_ary_new2(len); VALUE ary = rb_ary_new2(len);
for (int i = 0; i < len; i++) { for (int i = 0; i < len; ++i) {
VALUE value = rb_ary_entry(args, i); VALUE value = rb_ary_entry(args, i);
if (FIXNUM_P(value)) { if (FIXNUM_P(value)) {
rb_ary_store(ary, i, DEPEND_OBJECT(rb_klass, cvGetCol(CVARR(self), RB_CVALLOC(CvMat), FIX2INT(value)), self)); rb_ary_store(ary, i, DEPEND_OBJECT(rb_klass, cvGetCol(CVARR(self), RB_CVALLOC(CvMat), FIX2INT(value)), self));
}else{ }
else {
CvSlice slice = VALUE_TO_CVSLICE(value); CvSlice slice = VALUE_TO_CVSLICE(value);
rb_ary_store(ary, i, DEPEND_OBJECT(rb_klass, cvGetCols(CVARR(self), RB_CVALLOC(CvMat), rb_ary_store(ary, i, DEPEND_OBJECT(rb_klass, cvGetCols(CVARR(self), RB_CVALLOC(CvMat),
slice.start_index, slice.end_index), self)); slice.start_index, slice.end_index), self));
@ -1065,7 +1074,7 @@ VALUE
rb_each_row(VALUE self) rb_each_row(VALUE self)
{ {
int rows = CVMAT(self)->rows; int rows = CVMAT(self)->rows;
for (int i = 0; i < rows; i++) { for (int i = 0; i < rows; ++i) {
rb_yield(DEPEND_OBJECT(rb_klass, cvGetRow(CVARR(self), RB_CVALLOC(CvMat), i), self)); rb_yield(DEPEND_OBJECT(rb_klass, cvGetRow(CVARR(self), RB_CVALLOC(CvMat), i), self));
} }
return self; return self;
@ -1083,7 +1092,7 @@ VALUE
rb_each_col(VALUE self) rb_each_col(VALUE self)
{ {
int cols = CVMAT(self)->cols; int cols = CVMAT(self)->cols;
for (int i = 0; i < cols; i++) { for (int i = 0; i < cols; ++i) {
rb_yield(DEPEND_OBJECT(rb_klass, cvGetCol(CVARR(self), RB_CVALLOC(CvMat), i), self)); rb_yield(DEPEND_OBJECT(rb_klass, cvGetCol(CVARR(self), RB_CVALLOC(CvMat), i), self));
} }
return self; return self;
@ -1094,7 +1103,7 @@ rb_each_col(VALUE self)
* diag(<i>[val = 0]</i>) -> cvmat * diag(<i>[val = 0]</i>) -> cvmat
* *
* Return one of array diagonals. * Return one of array diagonals.
* <i>val</i> is zeo corresponds to the main diagonal, -1 corresponds to the diagonal above the main etc, 1 corresponds to the diagonal below the main etc. * <i>val</i> is zero corresponds to the main diagonal, -1 corresponds to the diagonal above the main etc, 1 corresponds to the diagonal below the main etc.
* *
*/ */
VALUE VALUE
@ -1155,7 +1164,7 @@ rb_dims(VALUE self)
VALUE VALUE
rb_dim_size(VALUE self, VALUE index) rb_dim_size(VALUE self, VALUE index)
{ {
return INT2FIX(cvGetDimSize(CVARR(self), FIX2INT(index))); return INT2FIX(cvGetDimSize(CVARR(self), NUM2INT(index)));
} }
/* /*
@ -1168,7 +1177,7 @@ VALUE
rb_aref(VALUE self, VALUE args) rb_aref(VALUE self, VALUE args)
{ {
int index[CV_MAX_DIM]; int index[CV_MAX_DIM];
for (int i = 0; i < RARRAY_LEN(args); i++) { for (int i = 0; i < RARRAY_LEN(args); ++i) {
index[i] = NUM2INT(rb_ary_entry(args, i)); index[i] = NUM2INT(rb_ary_entry(args, i));
} }
CvScalar scalar = cvScalarAll(0); CvScalar scalar = cvScalarAll(0);
@ -1198,7 +1207,7 @@ rb_aset(VALUE self, VALUE args)
{ {
CvScalar scalar = VALUE_TO_CVSCALAR(rb_ary_pop(args)); CvScalar scalar = VALUE_TO_CVSCALAR(rb_ary_pop(args));
int index[CV_MAX_DIM]; int index[CV_MAX_DIM];
for (int i = 0; i < RARRAY_LEN(args); i++) { for (int i = 0; i < RARRAY_LEN(args); ++i) {
index[i] = NUM2INT(rb_ary_entry(args, i)); index[i] = NUM2INT(rb_ary_entry(args, i));
} }
switch (RARRAY_LEN(args)) { switch (RARRAY_LEN(args)) {
@ -1268,6 +1277,7 @@ rb_set_data(VALUE self, VALUE data)
break; break;
default: default:
rb_raise(rb_eTypeError, "Invalid CvMat depth"); rb_raise(rb_eTypeError, "Invalid CvMat depth");
break;
} }
cvSetData(self_ptr, array, self_ptr->step); cvSetData(self_ptr, array, self_ptr->step);
@ -1386,7 +1396,8 @@ rb_set_identity_bang(int argc, VALUE *argv, VALUE self)
CvScalar value; CvScalar value;
if (rb_scan_args(argc, argv, "01", &val) < 1) { if (rb_scan_args(argc, argv, "01", &val) < 1) {
value = cvRealScalar(1); value = cvRealScalar(1);
}else{ }
else{
value = VALUE_TO_CVSCALAR(val); value = VALUE_TO_CVSCALAR(val);
} }
cvSetIdentity(CVARR(self), value); cvSetIdentity(CVARR(self), value);
@ -1447,8 +1458,8 @@ rb_reshape(VALUE self, VALUE hash)
rb_raise(rb_eTypeError, "argument should be Hash that contaion key (:row, :channel)."); rb_raise(rb_eTypeError, "argument should be Hash that contaion key (:row, :channel).");
VALUE channel = rb_hash_aref(hash, ID2SYM(rb_intern("channel"))); VALUE channel = rb_hash_aref(hash, ID2SYM(rb_intern("channel")));
VALUE rows = rb_hash_aref(hash, ID2SYM(rb_intern("rows"))); VALUE rows = rb_hash_aref(hash, ID2SYM(rb_intern("rows")));
return DEPEND_OBJECT(rb_klass, cvReshape(CVARR(self), RB_CVALLOC(CvMat), NIL_P(channel) ? 0 : FIX2INT(channel), return DEPEND_OBJECT(rb_klass, cvReshape(CVARR(self), RB_CVALLOC(CvMat), NIL_P(channel) ? 0 : NUM2INT(channel),
NIL_P(rows) ? 0 : FIX2INT(rows)), self); NIL_P(rows) ? 0 : NUM2INT(rows)), self);
} }
/* /*
@ -1536,11 +1547,11 @@ rb_split(VALUE self)
int type = CVMAT(self)->type, depth = CV_MAT_DEPTH(type), channel = CV_MAT_CN(type); int type = CVMAT(self)->type, depth = CV_MAT_DEPTH(type), channel = CV_MAT_CN(type);
CvSize size = cvGetSize(CVARR(self)); CvSize size = cvGetSize(CVARR(self));
CvMat *dest[] = { NULL, NULL, NULL, NULL }; CvMat *dest[] = { NULL, NULL, NULL, NULL };
for (int i = 0; i < channel; i++) for (int i = 0; i < channel; ++i)
dest[i] = rb_cvCreateMat(size.height, size.width, CV_MAKETYPE(depth, 1)); dest[i] = rb_cvCreateMat(size.height, size.width, CV_MAKETYPE(depth, 1));
cvSplit(CVARR(self), dest[0], dest[1], dest[2], dest[3]); cvSplit(CVARR(self), dest[0], dest[1], dest[2], dest[3]);
VALUE ary = rb_ary_new2(channel); VALUE ary = rb_ary_new2(channel);
for (int i = 0; i < channel; i++) for (int i = 0; i < channel; ++i)
rb_ary_store(ary, i, OPENCV_OBJECT(rb_klass, dest[i])); rb_ary_store(ary, i, OPENCV_OBJECT(rb_klass, dest[i]));
return ary; return ary;
} }
@ -1560,16 +1571,15 @@ rb_merge(VALUE klass, VALUE args)
{ {
VALUE object, dest; VALUE object, dest;
int len = RARRAY_LEN(args); int len = RARRAY_LEN(args);
if (!(len > 0) || len > CV_CN_MAX) { if (len <= 0 || len > 4) {
rb_raise(rb_eArgError, "wrong number of argument (%d for 1..4)", len); rb_raise(rb_eArgError, "wrong number of argument (%d for 1..4)", len);
} }
CvMat *src[] = { NULL, NULL, NULL, NULL }, *tmp = 0; CvMat *src[] = { NULL, NULL, NULL, NULL }, *tmp = 0;
for (int i = 0; i < len; i++) { for (int i = 0; i < len; ++i) {
if (rb_obj_is_kind_of((object = rb_ary_entry(args, i)), rb_klass)) { if (rb_obj_is_kind_of((object = rb_ary_entry(args, i)), rb_klass)) {
src[i] = CVMAT(object); src[i] = CVMAT(object);
if (CV_MAT_CN(src[i]->type) != 1) { if (CV_MAT_CN(src[i]->type) != 1)
rb_raise(rb_eStandardError, "image should be single-channel CvMat."); rb_raise(rb_eStandardError, "image should be single-channel CvMat.");
}
if (!tmp) if (!tmp)
tmp = src[i]; tmp = src[i];
else { else {
@ -1578,10 +1588,12 @@ rb_merge(VALUE klass, VALUE args)
if (!CV_ARE_DEPTHS_EQ(tmp, src[i])) if (!CV_ARE_DEPTHS_EQ(tmp, src[i]))
rb_raise(rb_eStandardError, "image depth should be same."); rb_raise(rb_eStandardError, "image depth should be same.");
} }
}else if (NIL_P(object)) { }
else if (NIL_P(object)) {
src[i] = NULL; src[i] = NULL;
}else }
rb_raise(rb_eTypeError, "argument should be CvMat or subclass of it."); else
rb_raise(rb_eTypeError, "argument should be CvMat or subclass");
} }
// TODO: adapt IplImage // TODO: adapt IplImage
dest = new_object(cvGetSize(tmp), CV_MAKETYPE(CV_MAT_DEPTH(tmp->type), len)); dest = new_object(cvGetSize(tmp), CV_MAKETYPE(CV_MAT_DEPTH(tmp->type), len));
@ -1657,7 +1669,7 @@ VALUE
rb_lut(VALUE self, VALUE lut) rb_lut(VALUE self, VALUE lut)
{ {
VALUE dest = copy(self); VALUE dest = copy(self);
cvLUT(CVARR(self), CVARR(dest), CVARR(lut)); cvLUT(CVARR(self), CVARR(dest), CVMAT_WITH_CHECK(lut));
return dest; return dest;
} }

View file

@ -287,6 +287,15 @@ CVMAT(VALUE object)
return cvGetMat(ptr, &stub); return cvGetMat(ptr, &stub);
} }
inline CvMat*
CVMAT_WITH_CHECK(VALUE object)
{
if (!rb_obj_is_kind_of(object, cCvMat::rb_class()))
rb_raise(rb_eTypeError, "wrong argument type %s (expected %s)",
rb_class2name(CLASS_OF(object)), rb_class2name(cCvMat::rb_class()));
return CVMAT(object);
}
inline CvMat* inline CvMat*
MASK(VALUE object) MASK(VALUE object)
{ {

View file

@ -52,10 +52,13 @@ VALUE_TO_CVSCALAR(VALUE object)
{ {
if (FIXNUM_P(object)) if (FIXNUM_P(object))
return cvScalarAll(FIX2INT(object)); return cvScalarAll(FIX2INT(object));
else if (rb_respond_to(object, rb_intern("[]")))
return cvScalar(NUM2DBL(rb_funcall(object, rb_intern("[]"), 1, INT2FIX(0))), return cvScalar(NUM2DBL(rb_funcall(object, rb_intern("[]"), 1, INT2FIX(0))),
NUM2DBL(rb_funcall(object, rb_intern("[]"), 1, INT2FIX(1))), NUM2DBL(rb_funcall(object, rb_intern("[]"), 1, INT2FIX(1))),
NUM2DBL(rb_funcall(object, rb_intern("[]"), 1, INT2FIX(2))), NUM2DBL(rb_funcall(object, rb_intern("[]"), 1, INT2FIX(2))),
NUM2DBL(rb_funcall(object, rb_intern("[]"), 1, INT2FIX(3)))); NUM2DBL(rb_funcall(object, rb_intern("[]"), 1, INT2FIX(3))));
else
rb_raise(rb_eTypeError, "require %s or compatible object.", rb_class2name(cCvScalar::rb_class()));
} }
__NAMESPACE_END_OPENCV __NAMESPACE_END_OPENCV

View file

@ -12,17 +12,19 @@ class OpenCVTestCase < Test::Unit::TestCase
HAARCASCADE_FRONTALFACE_ALT = SAMPLE_DIR + 'haarcascade_frontalface_alt.xml.gz' HAARCASCADE_FRONTALFACE_ALT = SAMPLE_DIR + 'haarcascade_frontalface_alt.xml.gz'
AVI_SAMPLE = SAMPLE_DIR + 'movie_sample.avi' AVI_SAMPLE = SAMPLE_DIR + 'movie_sample.avi'
DUMMY_OBJ = Digest::MD5.new # dummy object for argument type check test
CvMat.class_eval do CvMat.class_eval do
# Range check for debug # Range check for debug
alias original_aref [] alias original_aref []
alias original_aset []=; alias original_aset []=;
def [](*idx) def [](*idx)
if idx.size == 1 if idx.size == 1 and idx[0].is_a? Numeric
n = idx[0] n = idx[0]
throw ArgumentError.new("index #{n} is out of range") if n >= rows * cols throw ArgumentError.new("index #{n} is out of range") if n >= rows * cols
else elsif idx.all? { |elem| elem.is_a? Numeric }
j, i = *idx j, i = *(idx.map { |x| x.to_i })
throw ArgumentError.new("index for row #{j} is out of range") if j >= rows throw ArgumentError.new("index for row #{j} is out of range") if j >= rows
throw ArgumentError.new("index for column #{i} is out of range") if i >= cols throw ArgumentError.new("index for column #{i} is out of range") if i >= cols
end end
@ -30,13 +32,13 @@ class OpenCVTestCase < Test::Unit::TestCase
end end
def []=(*args) def []=(*args)
if args.size == 2 if args.size == 2 and args[0].is_a? Numeric
n = args[0] # index n = args[0] # index
throw ArgumentError.new("index #{n} is out of range") if n >= rows * cols throw ArgumentError.new("index #{n} is out of range") if n >= rows * cols
else elsif args[0..1].all? { |elem| elem.is_a? Numeric }
j, i = *args j, i = *args
throw ArgumentError.new("index for row #{j} is out of range") if j >= rows throw ArgumentError.new("index for row #{j} is out of range") if j.to_i >= rows
throw ArgumentError.new("index for column #{i} is out of range") if i >= cols throw ArgumentError.new("index for column #{i} is out of range") if i.to_i >= cols
end end
original_aset(*args) original_aset(*args)
end end

View file

@ -36,6 +36,16 @@ class TestCvMat < OpenCVTestCase
assert_equal(ch, m.channel) assert_equal(ch, m.channel)
} }
} }
assert_raise(TypeError) {
m = CvMat.new(DUMMY_OBJ, 20, :cv8u, 1)
}
assert_raise(TypeError) {
m = CvMat.new(10, DUMMY_OBJ, :cv8u, 1)
}
assert_raise(TypeError) {
m = CvMat.new(10, 20, :cv8u, DUMMY_OBJ)
}
end end
def test_load def test_load
@ -67,10 +77,10 @@ class TestCvMat < OpenCVTestCase
CvMat.load CvMat.load
} }
assert_raise(TypeError) { assert_raise(TypeError) {
CvMat.load(123) CvMat.load(DUMMY_OBJ)
} }
assert_raise(TypeError) { assert_raise(TypeError) {
CvMat.load(FILENAME_CAT, 'foobar') CvMat.load(FILENAME_CAT, DUMMY_OBJ)
} }
assert_raise(StandardError) { assert_raise(StandardError) {
CvMat.load('file/does/not/exist') CvMat.load('file/does/not/exist')
@ -200,7 +210,7 @@ class TestCvMat < OpenCVTestCase
assert_nil(m1.copy(-1)) assert_nil(m1.copy(-1))
assert_raise(ArgumentError) { assert_raise(ArgumentError) {
m1.copy('foobar') m1.copy(DUMMY_OBJ)
} }
end end
@ -286,6 +296,28 @@ class TestCvMat < OpenCVTestCase
assert_cvscalar_equal(m1[j, i], m2[j, i]) assert_cvscalar_equal(m1[j, i], m2[j, i])
} }
} }
assert_raise(TypeError) {
m1.sub_rect(DUMMY_OBJ)
}
assert_raise(TypeError) {
m1.sub_rect(DUMMY_OBJ, CvSize.new(1, 2))
}
assert_raise(TypeError) {
m1.sub_rect(CvPoint.new(1, 2), DUMMY_OBJ)
}
assert_raise(TypeError) {
m1.sub_rect(DUMMY_OBJ, 2, 3, 4)
}
assert_raise(TypeError) {
m1.sub_rect(1, DUMMY_OBJ, 3, 4)
}
assert_raise(TypeError) {
m1.sub_rect(1, 2, DUMMY_OBJ, 4)
}
assert_raise(TypeError) {
m1.sub_rect(1, 2, 3, DUMMY_OBJ)
}
end end
def test_slice_width def test_slice_width
@ -304,6 +336,13 @@ class TestCvMat < OpenCVTestCase
assert_cvscalar_equal(m1[j, (m1.width / 2) + i], mr[j, i]) assert_cvscalar_equal(m1[j, (m1.width / 2) + i], mr[j, i])
} }
} }
assert_raise(ArgumentError) {
m1.slice_width(0)
}
assert_raise(TypeError) {
m1.slice_width(DUMMY_OBJ)
}
end end
def test_slice_height def test_slice_height
@ -322,6 +361,13 @@ class TestCvMat < OpenCVTestCase
assert_cvscalar_equal(m1[(m1.height / 2) + j, i], mb[j, i]) assert_cvscalar_equal(m1[(m1.height / 2) + j, i], mb[j, i])
} }
} }
assert_raise(ArgumentError) {
m1.slice_height(0)
}
assert_raise(TypeError) {
m1.slice_height(DUMMY_OBJ)
}
end end
def test_row def test_row
@ -343,6 +389,14 @@ class TestCvMat < OpenCVTestCase
assert_cvscalar_equal(m1[1, i], m2[i]) assert_cvscalar_equal(m1[1, i], m2[i])
assert_cvscalar_equal(m1[2, i], m3[i]) assert_cvscalar_equal(m1[2, i], m3[i])
} }
assert_raise(TypeError) {
m1.row(DUMMY_OBJ)
}
flunk('FIXME: Not handle out of range error yet')
# assert_raise(ArgumentError) {
# m1.row(-1)
# }
end end
def test_col def test_col
@ -364,6 +418,15 @@ class TestCvMat < OpenCVTestCase
assert_cvscalar_equal(m1[j, 1], m2[j]) assert_cvscalar_equal(m1[j, 1], m2[j])
assert_cvscalar_equal(m1[j, 2], m3[j]) assert_cvscalar_equal(m1[j, 2], m3[j])
} }
assert_raise(TypeError) {
m1.col(DUMMY_OBJ)
}
flunk('FIXME: Not handle out of range error yet')
# assert_raise(ArgumentError) {
# m1.col(-1)
# }
end end
def test_each_row def test_each_row
@ -438,6 +501,13 @@ class TestCvMat < OpenCVTestCase
a.each_with_index { |s, i| a.each_with_index { |s, i|
assert_cvscalar_equal(s, d[i]) assert_cvscalar_equal(s, d[i])
} }
flunk('FIXME: Not handle out of range error yet')
# [m.rows, m.cols, -m.rows, -m.cols].each { |d|
# assert_raise(ArgumentError) {
# m.diag(d)
# }
# }
end end
def test_size def test_size
@ -455,6 +525,10 @@ class TestCvMat < OpenCVTestCase
m = CvMat.new(2, 3) m = CvMat.new(2, 3)
assert_equal(2, m.dim_size(0)) assert_equal(2, m.dim_size(0))
assert_equal(3, m.dim_size(1)) assert_equal(3, m.dim_size(1))
assert_raise(TypeError) {
m.dim_size(DUMMY_OBJ)
}
end end
def test_aref def test_aref
@ -468,6 +542,10 @@ class TestCvMat < OpenCVTestCase
# Alias # Alias
assert_cvscalar_equal(CvScalar.new(1, 1, 1, 1), m.at(0)) assert_cvscalar_equal(CvScalar.new(1, 1, 1, 1), m.at(0))
assert_raise(TypeError) {
m[DUMMY_OBJ]
}
end end
def test_aset def test_aset
@ -480,6 +558,13 @@ class TestCvMat < OpenCVTestCase
assert_cvscalar_equal(CvScalar.new(4, 4, 4, 4), m[1, 0]) assert_cvscalar_equal(CvScalar.new(4, 4, 4, 4), m[1, 0])
m[1, 0, 2, 4] = CvScalar.new(5, 5, 5, 5) m[1, 0, 2, 4] = CvScalar.new(5, 5, 5, 5)
assert_cvscalar_equal(CvScalar.new(5, 5, 5, 5), m[1, 0]) assert_cvscalar_equal(CvScalar.new(5, 5, 5, 5), m[1, 0])
assert_raise(TypeError) {
m[DUMMY_OBJ] = CvScalar.new(10, 10, 10, 10)
}
assert_raise(TypeError) {
m[0] = DUMMY_OBJ
}
end end
def test_set_data def test_set_data
@ -507,6 +592,14 @@ class TestCvMat < OpenCVTestCase
(m.rows * m.cols).times { |i| (m.rows * m.cols).times { |i|
assert_equal(a.flatten[i], m[i][0]) assert_equal(a.flatten[i], m[i][0])
} }
[CV_8U, CV_8S, CV_16U, CV_16S, CV_32S, CV_32F, CV_64F].each { |depth|
m = CvMat.new(2, 3, depth, 1)
assert_raise(TypeError) {
a = [DUMMY_OBJ] * 6
m.set_data(a)
}
}
end end
def test_fill def test_fill
@ -576,6 +669,13 @@ class TestCvMat < OpenCVTestCase
end end
} }
} }
assert_raise(TypeError) {
m1.fill(DUMMY_OBJ)
}
assert_raise(TypeError) {
m1.fill(CvScalar.new(1), DUMMY_OBJ)
}
end end
def test_clear def test_clear
@ -616,6 +716,26 @@ class TestCvMat < OpenCVTestCase
end end
} }
} }
m1 = CvMat.new(5, 5, :cv8u, 4)
s = CvScalar.new(1, 2, 3, 4)
m2 = m1.identity(s)
m1.identity!(s)
m2.height.times { |j|
m2.width.times { |i|
if i == j
assert_cvscalar_equal(s, m1[j, i])
assert_cvscalar_equal(s, m2[j, i])
else
assert_cvscalar_equal(CvScalar.new(0, 0, 0, 0), m1[j, i])
assert_cvscalar_equal(CvScalar.new(0, 0, 0, 0), m2[j, i])
end
}
}
assert_raise(TypeError) {
m1.identity(DUMMY_OBJ)
}
end end
def test_range def test_range
@ -626,13 +746,17 @@ class TestCvMat < OpenCVTestCase
assert_cvscalar_equal(CvScalar.new(i, 0, 0, 0), m1[0, i]) assert_cvscalar_equal(CvScalar.new(i, 0, 0, 0), m1[0, i])
assert_cvscalar_equal(CvScalar.new(i, 0, 0, 0), m2[0, i]) assert_cvscalar_equal(CvScalar.new(i, 0, 0, 0), m2[0, i])
} }
assert_raise(TypeError) {
m1.range(DUMMY_OBJ, 2)
}
assert_raise(TypeError) {
m1.range(1, DUMMY_OBJ)
}
end end
def test_reshape def test_reshape
m = create_cvmat(2, 3, CV_8U, 3) m = create_cvmat(2, 3, CV_8U, 3)
assert_raise(TypeError) {
m.reshape(1)
}
vec = m.reshape(:rows => 1) vec = m.reshape(:rows => 1)
assert_equal(6, vec.width) assert_equal(6, vec.width)
@ -654,13 +778,16 @@ class TestCvMat < OpenCVTestCase
assert_cvscalar_equal(m[j, i], CvScalar.new(s1, s2, s3, 0)) assert_cvscalar_equal(m[j, i], CvScalar.new(s1, s2, s3, 0))
} }
} }
[DUMMY_OBJ, { :rows => DUMMY_OBJ }, { :channel => DUMMY_OBJ }].each { |arg|
assert_raise(TypeError) {
m.reshape(arg)
}
}
end end
def test_repeat def test_repeat
m1 = create_cvmat(2, 3, :cv8u, 3) m1 = create_cvmat(2, 3, :cv8u, 3)
assert_raise(TypeError) {
m1.repeat(1)
}
m2 = CvMat.new(6, 9, :cv8u, 3) m2 = CvMat.new(6, 9, :cv8u, 3)
m2 = m1.repeat(m2) m2 = m1.repeat(m2)
m2.height.times { |j| m2.height.times { |j|
@ -669,6 +796,9 @@ class TestCvMat < OpenCVTestCase
assert_cvscalar_equal(m2[j, i], a) assert_cvscalar_equal(m2[j, i], a)
} }
} }
assert_raise(TypeError) {
m1.repeat(DUMMY_OBJ)
}
end end
def test_flip def test_flip
@ -752,6 +882,31 @@ class TestCvMat < OpenCVTestCase
assert_cvscalar_equal(m0[j, i], m[j, i]) assert_cvscalar_equal(m0[j, i], m[j, i])
} }
} }
m5 = create_cvmat(2, 3, :cv8u, 1) { |j, i, c|
CvScalar.new(c * 50)
}
assert_raise(TypeError) {
CvMat.merge(DUMMY_OBJ)
}
assert_raise(ArgumentError) {
CvMat.merge
}
assert_raise(ArgumentError) {
CvMat.merge(m1, m2, m3, m4, m5)
}
assert_raise(StandardError) {
CvMat.merge(CvMat.new(1, 2, :cv8u, 2))
}
assert_raise(StandardError) {
CvMat.merge(CvMat.new(1, 2, :cv8u, 1),
CvMat.new(2, 2, :cv8u, 1))
}
assert_raise(StandardError) {
CvMat.merge(CvMat.new(1, 2, :cv8u, 1),
CvMat.new(1, 2, :cv32f, 1))
}
end end
def test_mix_channels def test_mix_channels
@ -783,6 +938,13 @@ class TestCvMat < OpenCVTestCase
[m1, m2, m3, m4].each { |m| [m1, m2, m3, m4].each { |m|
assert_shuffled_equal.call(m0, m) assert_shuffled_equal.call(m0, m)
} }
assert_raise(TypeError) {
m0.rand_shuffle(DUMMY_OBJ)
}
assert_raise(TypeError) {
m0.rand_shuffle(123, DUMMY_OBJ)
}
end end
def test_lut def test_lut
@ -800,6 +962,10 @@ class TestCvMat < OpenCVTestCase
assert_cvscalar_equal(CvScalar.new(r, g, b, 0), m[j, i]) assert_cvscalar_equal(CvScalar.new(r, g, b, 0), m[j, i])
} }
} }
assert_raise(TypeError) {
m0.lut(DUMMY_OBJ)
}
end end
def test_convert_scale def test_convert_scale
@ -1816,11 +1982,11 @@ class TestCvMat < OpenCVTestCase
end end
def test_svd def test_svd
flunk('CvMat#svd is not implemented yet') flunk('FIXME: CvMat#svd is not implemented yet')
end end
def test_svdksb def test_svdksb
flunk('CvMat#svdksb is not implemented yet') flunk('FIXME: CvMat#svdksb is not implemented yet')
end end
def test_eigenvv def test_eigenvv
@ -1849,11 +2015,11 @@ class TestCvMat < OpenCVTestCase
end end
def test_calc_covar_matrix def test_calc_covar_matrix
flunk('CvMat#calc_covar_matrix is not implemented yet') flunk('FIXME: CvMat#calc_covar_matrix is not implemented yet')
end end
def test_mahalonobis def test_mahalonobis
flunk('CvMat#mahalonobis is not implemented yet') flunk('FIXME: CvMat#mahalonobis is not implemented yet')
end end
def test_find_homography def test_find_homography