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:
parent
041f9cc89f
commit
20d71ff11c
5 changed files with 263 additions and 71 deletions
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -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)
|
||||||
{
|
{
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue