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;
rb_scan_args(argc, argv, "22", &row, &column, &depth, &channel);
CvMat *ptr = rb_cvCreateMat(FIX2INT(row), FIX2INT(column),
CV_MAKETYPE(CVMETHOD("DEPTH", depth, CV_8U), argc < 4 ? 3 : FIX2INT(channel)));
int ch = (argc < 4) ? 3 : NUM2INT(channel);
CvMat *ptr = rb_cvCreateMat(NUM2INT(row), NUM2INT(column),
CV_MAKETYPE(CVMETHOD("DEPTH", depth, CV_8U), ch));
free(DATA_PTR(self));
DATA_PTR(self) = ptr;
@ -721,11 +722,11 @@ rb_copy(int argc, VALUE *argv, VALUE self)
cvCopy(src, CVMAT(value));
return Qnil;
}
else if (rb_obj_is_kind_of(value, rb_cFixnum)) {
else if (FIXNUM_P(value)) {
int n = FIX2INT(value);
if (n > 0) {
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);
cvCopy(src, CVMAT(tmp));
rb_ary_store(copied, i, tmp);
@ -962,13 +963,15 @@ VALUE
rb_slice_width(VALUE self, VALUE 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));
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;
VALUE ary = rb_ary_new2(n);
for (int i = 0; i < n; i++) {
CvRect rect = {div_x * i, 0, div_x, size.height};
for (int i = 0; i < n; ++i) {
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));
}
return ary;
@ -987,13 +990,15 @@ VALUE
rb_slice_height(VALUE self, VALUE 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));
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;
VALUE ary = rb_ary_new2(n);
for (int i = 0; i < n; i++) {
CvRect rect = {0, div_y * i, size.width, div_y};
for (int i = 0; i < n; ++i) {
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));
}
return ary;
@ -1011,13 +1016,15 @@ VALUE
rb_row(VALUE self, VALUE 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);
for (int i = 0; i < len; i++) {
for (int i = 0; i < len; ++i) {
VALUE value = rb_ary_entry(args, i);
if (FIXNUM_P(value)) {
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);
rb_ary_store(ary, i, DEPEND_OBJECT(rb_klass, cvGetRows(CVARR(self), RB_CVALLOC(CvMat),
slice.start_index, slice.end_index), self));
@ -1038,13 +1045,15 @@ VALUE
rb_col(VALUE self, VALUE 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);
for (int i = 0; i < len; i++) {
for (int i = 0; i < len; ++i) {
VALUE value = rb_ary_entry(args, i);
if (FIXNUM_P(value)) {
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);
rb_ary_store(ary, i, DEPEND_OBJECT(rb_klass, cvGetCols(CVARR(self), RB_CVALLOC(CvMat),
slice.start_index, slice.end_index), self));
@ -1065,7 +1074,7 @@ VALUE
rb_each_row(VALUE self)
{
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));
}
return self;
@ -1083,7 +1092,7 @@ VALUE
rb_each_col(VALUE self)
{
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));
}
return self;
@ -1094,7 +1103,7 @@ rb_each_col(VALUE self)
* diag(<i>[val = 0]</i>) -> cvmat
*
* 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
@ -1155,7 +1164,7 @@ rb_dims(VALUE self)
VALUE
rb_dim_size(VALUE self, VALUE index)
{
return INT2FIX(cvGetDimSize(CVARR(self), FIX2INT(index)));
return INT2FIX(cvGetDimSize(CVARR(self), NUM2INT(index)));
}
/*
@ -1168,11 +1177,11 @@ VALUE
rb_aref(VALUE self, VALUE args)
{
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));
}
CvScalar scalar = cvScalarAll(0);
switch(RARRAY_LEN(args)) {
switch (RARRAY_LEN(args)) {
case 1:
scalar = cvGet1D(CVARR(self), index[0]);
break;
@ -1198,10 +1207,10 @@ rb_aset(VALUE self, VALUE args)
{
CvScalar scalar = VALUE_TO_CVSCALAR(rb_ary_pop(args));
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));
}
switch(RARRAY_LEN(args)) {
switch (RARRAY_LEN(args)) {
case 1:
cvSet1D(CVARR(self), index[0], scalar);
break;
@ -1268,6 +1277,7 @@ rb_set_data(VALUE self, VALUE data)
break;
default:
rb_raise(rb_eTypeError, "Invalid CvMat depth");
break;
}
cvSetData(self_ptr, array, self_ptr->step);
@ -1386,7 +1396,8 @@ rb_set_identity_bang(int argc, VALUE *argv, VALUE self)
CvScalar value;
if (rb_scan_args(argc, argv, "01", &val) < 1) {
value = cvRealScalar(1);
}else{
}
else{
value = VALUE_TO_CVSCALAR(val);
}
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).");
VALUE channel = rb_hash_aref(hash, ID2SYM(rb_intern("channel")));
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),
NIL_P(rows) ? 0 : FIX2INT(rows)), self);
return DEPEND_OBJECT(rb_klass, cvReshape(CVARR(self), RB_CVALLOC(CvMat), NIL_P(channel) ? 0 : NUM2INT(channel),
NIL_P(rows) ? 0 : NUM2INT(rows)), self);
}
/*
@ -1535,12 +1546,12 @@ rb_split(VALUE self)
{
int type = CVMAT(self)->type, depth = CV_MAT_DEPTH(type), channel = CV_MAT_CN(type);
CvSize size = cvGetSize(CVARR(self));
CvMat *dest[] = {NULL, NULL, NULL, NULL};
for (int i = 0; i < channel; i++)
CvMat *dest[] = { NULL, NULL, NULL, NULL };
for (int i = 0; i < channel; ++i)
dest[i] = rb_cvCreateMat(size.height, size.width, CV_MAKETYPE(depth, 1));
cvSplit(CVARR(self), dest[0], dest[1], dest[2], dest[3]);
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]));
return ary;
}
@ -1560,28 +1571,29 @@ rb_merge(VALUE klass, VALUE args)
{
VALUE object, dest;
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);
}
CvMat *src[] = {NULL, NULL, NULL, NULL}, *tmp = 0;
for (int i = 0; i < len; i++) {
CvMat *src[] = { NULL, NULL, NULL, NULL }, *tmp = 0;
for (int i = 0; i < len; ++i) {
if (rb_obj_is_kind_of((object = rb_ary_entry(args, i)), rb_klass)) {
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.");
}
if (!tmp)
tmp = src[i];
else{
else {
if (!CV_ARE_SIZES_EQ(tmp, src[i]))
rb_raise(rb_eStandardError, "image size should be same.");
if (!CV_ARE_DEPTHS_EQ(tmp, src[i]))
rb_raise(rb_eStandardError, "image depth should be same.");
}
}else if (NIL_P(object)) {
}
else if (NIL_P(object)) {
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
dest = new_object(cvGetSize(tmp), CV_MAKETYPE(CV_MAT_DEPTH(tmp->type), len));
@ -1632,9 +1644,9 @@ rb_rand_shuffle_bang(int argc, VALUE *argv, VALUE self)
VALUE seed, iter;
CvRNG rng;
rb_scan_args(argc, argv, "02", &seed, &iter);
if(NIL_P(seed))
if (NIL_P(seed))
cvRandShuffle(CVARR(self), NULL, IF_INT(iter, 1));
else{
else {
rng = cvRNG(rb_num2ll(seed));
cvRandShuffle(CVARR(self), &rng, IF_INT(iter, 1));
}
@ -1657,7 +1669,7 @@ VALUE
rb_lut(VALUE self, VALUE lut)
{
VALUE dest = copy(self);
cvLUT(CVARR(self), CVARR(dest), CVARR(lut));
cvLUT(CVARR(self), CVARR(dest), CVMAT_WITH_CHECK(lut));
return dest;
}

View file

@ -287,6 +287,15 @@ CVMAT(VALUE object)
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*
MASK(VALUE object)
{

View file

@ -50,12 +50,15 @@ CVSCALAR(VALUE object)
inline CvScalar
VALUE_TO_CVSCALAR(VALUE object)
{
if(FIXNUM_P(object))
if (FIXNUM_P(object))
return cvScalarAll(FIX2INT(object));
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(2))),
NUM2DBL(rb_funcall(object, rb_intern("[]"), 1, INT2FIX(3))));
else if (rb_respond_to(object, rb_intern("[]")))
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(2))),
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

View file

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

View file

@ -36,6 +36,16 @@ class TestCvMat < OpenCVTestCase
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
def test_load
@ -67,10 +77,10 @@ class TestCvMat < OpenCVTestCase
CvMat.load
}
assert_raise(TypeError) {
CvMat.load(123)
CvMat.load(DUMMY_OBJ)
}
assert_raise(TypeError) {
CvMat.load(FILENAME_CAT, 'foobar')
CvMat.load(FILENAME_CAT, DUMMY_OBJ)
}
assert_raise(StandardError) {
CvMat.load('file/does/not/exist')
@ -198,9 +208,9 @@ class TestCvMat < OpenCVTestCase
}
}
assert_nil(m1.copy(-1))
assert_raise(ArgumentError) {
m1.copy('foobar')
m1.copy(DUMMY_OBJ)
}
end
@ -286,6 +296,28 @@ class TestCvMat < OpenCVTestCase
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
def test_slice_width
@ -304,6 +336,13 @@ class TestCvMat < OpenCVTestCase
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
def test_slice_height
@ -322,6 +361,13 @@ class TestCvMat < OpenCVTestCase
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
def test_row
@ -343,6 +389,14 @@ class TestCvMat < OpenCVTestCase
assert_cvscalar_equal(m1[1, i], m2[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
def test_col
@ -364,6 +418,15 @@ class TestCvMat < OpenCVTestCase
assert_cvscalar_equal(m1[j, 1], m2[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
def test_each_row
@ -438,6 +501,13 @@ class TestCvMat < OpenCVTestCase
a.each_with_index { |s, 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
def test_size
@ -455,6 +525,10 @@ class TestCvMat < OpenCVTestCase
m = CvMat.new(2, 3)
assert_equal(2, m.dim_size(0))
assert_equal(3, m.dim_size(1))
assert_raise(TypeError) {
m.dim_size(DUMMY_OBJ)
}
end
def test_aref
@ -468,6 +542,10 @@ class TestCvMat < OpenCVTestCase
# Alias
assert_cvscalar_equal(CvScalar.new(1, 1, 1, 1), m.at(0))
assert_raise(TypeError) {
m[DUMMY_OBJ]
}
end
def test_aset
@ -480,6 +558,13 @@ class TestCvMat < OpenCVTestCase
assert_cvscalar_equal(CvScalar.new(4, 4, 4, 4), m[1, 0])
m[1, 0, 2, 4] = CvScalar.new(5, 5, 5, 5)
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
def test_set_data
@ -507,6 +592,14 @@ class TestCvMat < OpenCVTestCase
(m.rows * m.cols).times { |i|
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
def test_fill
@ -576,6 +669,13 @@ class TestCvMat < OpenCVTestCase
end
}
}
assert_raise(TypeError) {
m1.fill(DUMMY_OBJ)
}
assert_raise(TypeError) {
m1.fill(CvScalar.new(1), DUMMY_OBJ)
}
end
def test_clear
@ -616,6 +716,26 @@ class TestCvMat < OpenCVTestCase
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
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), m2[0, i])
}
assert_raise(TypeError) {
m1.range(DUMMY_OBJ, 2)
}
assert_raise(TypeError) {
m1.range(1, DUMMY_OBJ)
}
end
def test_reshape
m = create_cvmat(2, 3, CV_8U, 3)
assert_raise(TypeError) {
m.reshape(1)
}
vec = m.reshape(:rows => 1)
assert_equal(6, vec.width)
@ -654,13 +778,16 @@ class TestCvMat < OpenCVTestCase
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
def test_repeat
m1 = create_cvmat(2, 3, :cv8u, 3)
assert_raise(TypeError) {
m1.repeat(1)
}
m2 = CvMat.new(6, 9, :cv8u, 3)
m2 = m1.repeat(m2)
m2.height.times { |j|
@ -669,6 +796,9 @@ class TestCvMat < OpenCVTestCase
assert_cvscalar_equal(m2[j, i], a)
}
}
assert_raise(TypeError) {
m1.repeat(DUMMY_OBJ)
}
end
def test_flip
@ -686,7 +816,7 @@ class TestCvMat < OpenCVTestCase
m7 = m0.clone
m7.flip!
m8 = m0.flip
[m1, m2, m3, m4, m5, m6, m7, m8].each { |m|
assert_equal(m0.height, m.height)
assert_equal(m0.width, m.width)
@ -752,6 +882,31 @@ class TestCvMat < OpenCVTestCase
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
def test_mix_channels
@ -783,6 +938,13 @@ class TestCvMat < OpenCVTestCase
[m1, m2, m3, m4].each { |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
def test_lut
@ -800,6 +962,10 @@ class TestCvMat < OpenCVTestCase
assert_cvscalar_equal(CvScalar.new(r, g, b, 0), m[j, i])
}
}
assert_raise(TypeError) {
m0.lut(DUMMY_OBJ)
}
end
def test_convert_scale
@ -1816,11 +1982,11 @@ class TestCvMat < OpenCVTestCase
end
def test_svd
flunk('CvMat#svd is not implemented yet')
flunk('FIXME: CvMat#svd is not implemented yet')
end
def test_svdksb
flunk('CvMat#svdksb is not implemented yet')
flunk('FIXME: CvMat#svdksb is not implemented yet')
end
def test_eigenvv
@ -1849,11 +2015,11 @@ class TestCvMat < OpenCVTestCase
end
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
def test_mahalonobis
flunk('CvMat#mahalonobis is not implemented yet')
flunk('FIXME: CvMat#mahalonobis is not implemented yet')
end
def test_find_homography