diff --git a/test/test_cvmat.rb b/test/test_cvmat.rb index 9120e74..9eeffcb 100755 --- a/test/test_cvmat.rb +++ b/test/test_cvmat.rb @@ -10,6 +10,18 @@ include OpenCV # Tests for OpenCV::CvMat class TestCvMat < TestOpenCV + def make_cvmat(h, w, depth = :cv8u, channel = 3) + m = CvMat.new(h, w, depth, channel) + count = 1 + h.times { |j| + w.times { |i| + m[i, j] = count + count += 1 + } + } + m + end + def test_DRAWING_OPTION CvMat::DRAWING_OPTION[:color].to_ary.each { |c| assert_in_delta(0, c, 0.01) @@ -61,19 +73,239 @@ class TestCvMat < TestOpenCV assert_in_delta(0.99, CvMat::FIND_FUNDAMENTAL_MAT_OPTION[:desirable_level], 0.01) end - def test_avg_sdv - m = CvMat.new(1, 8, CV_32F) - [2, 4, 4, 4, 5, 5, 7, 9].each_with_index { |v, i| - m[i] = CvScalar.new(v, 0, 0, 0) - # m[i][0] = v - } - avg = m.avg - assert_in_delta(avg[0], 5.0, 0.01) - avg, sdv = m.avg_sdv - assert_in_delta(avg[0], 5.0, 0.01) - assert_in_delta(sdv[0], 2.0, 0.01) + def test_to_s + m = CvMat.new(10, 20) + assert_equal('', m.to_s) + m = CvMat.new(10, 20, :cv16s) + assert_equal('', m.to_s) + m = CvMat.new(10, 20, :cv32f, 1) + assert_equal('', m.to_s) end + def test_parent + m1 = CvMat.new(10, 20) + assert((not m1.has_parent?)) + assert_nil(m1.parent) + + flunk('TODO: resolve unexpected ABORT of CvMat#to_CvMat') + # m2 = m1.to_CvMat + # assert(m2.has_parent?) + # assert_same(m1, m2.parent) + end + + def test_inside + m = CvMat.new(20, 10) + assert(m.inside? CvPoint.new(0, 0)) + assert(m.inside? CvPoint.new(9, 19)) + assert((not m.inside? CvPoint.new(10, 0))) + assert((not m.inside? CvPoint.new(0, 20))) + assert((not m.inside? CvPoint.new(10, 20))) + end + + def test_to_IplConvKernel + kernel = CvMat.new(10, 20).to_IplConvKernel(CvPoint.new(2, 3)) + assert_equal(10, kernel.rows) + assert_equal(20, kernel.cols) + assert_equal(2, kernel.anchor.x) + assert_equal(3, kernel.anchor.y) + assert_equal(2, kernel.anchor_x) + assert_equal(3, kernel.anchor_y) + end + + def test_create_mask + mask = CvMat.new(10, 20).create_mask + assert_equal(20, mask.width) + assert_equal(10, mask.height) + assert_equal(:cv8u, mask.depth) + assert_equal(1, mask.channel) + end + + def test_fields + m = CvMat.new(20, 10) + assert_equal(10, m.width) + assert_equal(10, m.columns) + assert_equal(10, m.cols) + assert_equal(20, m.height) + assert_equal(20, m.rows) + assert_equal(:cv8u, m.depth) + assert_equal(3, m.channel) + + m = CvMat.new(20, 10, :cv16s, 1) + assert_equal(10, m.width) + assert_equal(10, m.columns) + assert_equal(10, m.cols) + assert_equal(20, m.height) + assert_equal(20, m.rows) + assert_equal(:cv16s, m.depth) + assert_equal(1, m.channel) + end + + def test_clone + m1 = make_cvmat(10, 20) + m2 = m1.clone + assert_equal(m1.data, m2.data) + end + + def test_copy + m1 = make_cvmat(10, 20, CV_32F, 1) + + m2 = m1.copy + assert_equal(m1.data, m2.data) + + m2 = CvMat.new(10, 20, CV_32F, 1) + m1.copy(m2) + m1.height.times { |j| + m1.width.times { |i| + assert(is_same_float_array(m1[i, j].to_ary, m2[i, j].to_ary)) + } + } + + assert_equal(m1.data, m2.data) + + m2 = CvMat.new(1, 2, CV_32F, 1) + assert_raise(CvUnmatchedSizes) { + m1.copy(m2) + } + + m2 = CvMat.new(10, 20, CV_32F, 3) + assert_raise(CvUnmatchedFormats) { + m1.copy(m2) + } + m2 = CvMat.new(10, 20, CV_8U, 1) + assert_raise(CvUnmatchedFormats) { + m1.copy(m2) + } + + a = m1.copy(2) + assert_equal(2, a.size) + a.each { |m| + m1.height.times { |j| + m1.width.times { |i| + assert(is_same_float_array(m1[i, j].to_ary, m[i, j].to_ary)) + } + } + } + assert_nil(m1.copy(-1)) + end + + def test_convert_depth + m = CvMat.new(10, 20, :cv32f) + assert_equal(:cv8u, m.to_8u.depth) + assert_equal(:cv8s, m.to_8s.depth) + assert_equal(:cv16u, m.to_16u.depth) + assert_equal(:cv16s, m.to_16s.depth) + assert_equal(:cv32s, m.to_32s.depth) + assert_equal(:cv32f, m.to_32f.depth) + assert_equal(:cv64f, m.to_64f.depth) + end + + def test_vector + m = CvMat.new(1, 2) + assert(m.vector?) + + m = CvMat.new(2, 2) + assert((not m.vector?)) + end + + def test_square + m = CvMat.new(2, 2) + assert(m.square?) + m = CvMat.new(1, 2) + assert((not m.square?)) + end + + def test_to_CvMat + flunk('TODO: resolve unexpected ABORT of CvMat#to_CvMat') + # m1 = CvMat.new(2, 2) + # m2 = m1.to_CvMat + # assert_same(m1, m2.parent) + end + + def test_sub_rect + m1 = make_cvmat(10, 10) + + assert_raise(ArgumentError) { + m1.sub_rect + } + + m2 = m1.sub_rect(CvRect.new(0, 0, 2, 3)) + assert_equal(2, m2.width) + assert_equal(3, m2.height) + m2.height.times { |j| + m2.width.times { |i| + assert(is_same_float_array(m1[i, j].to_ary, m2[i, j].to_ary)) + } + } + + topleft = CvPoint.new(2, 3) + m2 = m1.sub_rect(topleft, CvSize.new(4, 5)) + assert_equal(4, m2.width) + assert_equal(5, m2.height) + m2.height.times { |j| + m2.width.times { |i| + assert(is_same_float_array(m1[topleft.x + i, topleft.y + j].to_ary, m2[i, j].to_ary)) + } + } + + topleft = CvPoint.new(1, 2) + m2 = m1.sub_rect(topleft.x, topleft.y, 3, 4) + assert_equal(3, m2.width) + assert_equal(4, m2.height) + m2.height.times { |j| + m2.width.times { |i| + assert(is_same_float_array(m1[topleft.x + i, topleft.y + j].to_ary, m2[i, j].to_ary)) + } + } + end + + def test_slice_width + m1 = make_cvmat(10, 40, :cv32f, 1) + ml, mr = m1.slice_width(2) + [ml, mr].each { |m| + assert_equal(10, m.height) + assert_equal(20, m.width) + assert_equal(:cv32f, m.depth) + assert_equal(1, m.channel) + } + + ml.height.times { |j| + ml.width.times { |i| + assert(is_same_float_array(m1[i, j].to_ary, ml[i, j].to_ary)) + assert(is_same_float_array(m1[20 + i, j].to_ary, mr[i, j].to_ary)) + } + } + end + + def test_slice_height + m1 = make_cvmat(10, 20, :cv32f, 1) + mt, mb = m1.slice_height(2) + [mt, mb].each { |m| + assert_equal(5, m.height) + assert_equal(20, m.width) + assert_equal(:cv32f, m.depth) + assert_equal(1, m.channel) + } + + mt.height.times { |j| + mt.width.times { |i| + assert(is_same_float_array(m1[i, j].to_ary, mt[i, j].to_ary)) + assert(is_same_float_array(m1[i, 5 + j].to_ary, mb[i, j].to_ary)) + } + } + end + + # def test_avg_sdv + # m = CvMat.new(1, 8, CV_32F) + # [2, 4, 4, 4, 5, 5, 7, 9].each_with_index { |v, i| + # m[i] = CvScalar.new(v, 0, 0, 0) + # } + # avg = m.avg + # assert_in_delta(avg[0], 5.0, 0.01) + # avg, sdv = m.avg_sdv + # assert_in_delta(avg[0], 5.0, 0.01) + # assert_in_delta(sdv[0], 2.0, 0.01) + # end + end diff --git a/test/test_cvscalar.rb b/test/test_cvscalar.rb index 8b70412..cd8d38b 100755 --- a/test/test_cvscalar.rb +++ b/test/test_cvscalar.rb @@ -8,13 +8,6 @@ include OpenCV # Tests for OpenCV::CvScalar class TestCvScalar < TestOpenCV - def is_same_elems(a, b, delta = 0.01) - 4.times { |i| - return false unless (a[i].to_f - b[i].to_f).abs <= delta.to_f - } - true - end - def test_aref s = CvScalar.new 4.times { |i| assert_in_delta(0, s[i], 0.01) } @@ -62,22 +55,22 @@ class TestCvScalar < TestOpenCV end def test_cvcolor - assert(is_same_elems(CvColor::Black, CvScalar.new(0x0, 0x0, 0x0, 0))) - assert(is_same_elems(CvColor::Silver, CvScalar.new(0x0c, 0x0c, 0x0c, 0))) - assert(is_same_elems(CvColor::Gray, CvScalar.new(0x80, 0x80, 0x80, 0))) - assert(is_same_elems(CvColor::White, CvScalar.new(0xff, 0xff, 0xff, 0))) - assert(is_same_elems(CvColor::Maroon, CvScalar.new(0x0, 0x0, 0x80, 0))) - assert(is_same_elems(CvColor::Red, CvScalar.new(0x0, 0x0, 0xff, 0))) - assert(is_same_elems(CvColor::Purple, CvScalar.new(0x80, 0x0, 0x80, 0))) - assert(is_same_elems(CvColor::Fuchsia, CvScalar.new(0xff, 0x0, 0xff, 0))) - assert(is_same_elems(CvColor::Green, CvScalar.new(0x0, 0x80, 0x0, 0))) - assert(is_same_elems(CvColor::Lime, CvScalar.new(0x0, 0xff, 0x0, 0))) - assert(is_same_elems(CvColor::Olive, CvScalar.new(0x0, 0x80, 0x80, 0))) - assert(is_same_elems(CvColor::Yellow, CvScalar.new(0x0, 0xff, 0xff, 0))) - assert(is_same_elems(CvColor::Navy, CvScalar.new(0x80, 0x0, 0x0, 0))) - assert(is_same_elems(CvColor::Blue, CvScalar.new(0xff, 0x0, 0x0, 0))) - assert(is_same_elems(CvColor::Teal, CvScalar.new(0x80, 0x80, 0x0, 0))) - assert(is_same_elems(CvColor::Aqua, CvScalar.new(0xff, 0xff, 0x0, 0))) + assert(is_same_float_array(CvColor::Black, CvScalar.new(0x0, 0x0, 0x0, 0))) + assert(is_same_float_array(CvColor::Silver, CvScalar.new(0x0c, 0x0c, 0x0c, 0))) + assert(is_same_float_array(CvColor::Gray, CvScalar.new(0x80, 0x80, 0x80, 0))) + assert(is_same_float_array(CvColor::White, CvScalar.new(0xff, 0xff, 0xff, 0))) + assert(is_same_float_array(CvColor::Maroon, CvScalar.new(0x0, 0x0, 0x80, 0))) + assert(is_same_float_array(CvColor::Red, CvScalar.new(0x0, 0x0, 0xff, 0))) + assert(is_same_float_array(CvColor::Purple, CvScalar.new(0x80, 0x0, 0x80, 0))) + assert(is_same_float_array(CvColor::Fuchsia, CvScalar.new(0xff, 0x0, 0xff, 0))) + assert(is_same_float_array(CvColor::Green, CvScalar.new(0x0, 0x80, 0x0, 0))) + assert(is_same_float_array(CvColor::Lime, CvScalar.new(0x0, 0xff, 0x0, 0))) + assert(is_same_float_array(CvColor::Olive, CvScalar.new(0x0, 0x80, 0x80, 0))) + assert(is_same_float_array(CvColor::Yellow, CvScalar.new(0x0, 0xff, 0xff, 0))) + assert(is_same_float_array(CvColor::Navy, CvScalar.new(0x80, 0x0, 0x0, 0))) + assert(is_same_float_array(CvColor::Blue, CvScalar.new(0xff, 0x0, 0x0, 0))) + assert(is_same_float_array(CvColor::Teal, CvScalar.new(0x80, 0x80, 0x0, 0))) + assert(is_same_float_array(CvColor::Aqua, CvScalar.new(0xff, 0xff, 0x0, 0))) end end diff --git a/test/test_opencv.rb b/test/test_opencv.rb index 5becfd3..217dd9c 100755 --- a/test/test_opencv.rb +++ b/test/test_opencv.rb @@ -54,6 +54,13 @@ class TestOpenCV < Test::Unit::TestCase # Compute a hash for an image, useful for image comparisons Digest::MD5.hexdigest(img.data) end + + def is_same_float_array(a, b, delta = 0.01) + 4.times { |i| + return false unless (a[i].to_f - b[i].to_f).abs <= delta.to_f + } + true + end end