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

fixed CvMat#integral

This commit is contained in:
ser1zw 2011-07-06 23:21:38 +09:00
parent 79e9e17844
commit 366e9e2bc0
2 changed files with 71 additions and 21 deletions

View file

@ -3960,21 +3960,26 @@ rb_copy_make_border_replicate(int argc, VALUE *argv, VALUE self)
VALUE VALUE
rb_integral(int argc, VALUE *argv, VALUE self) rb_integral(int argc, VALUE *argv, VALUE self)
{ {
VALUE sum, sqsum, tilted_sum, dest; VALUE need_sqsum = Qfalse, need_tiled_sum = Qfalse;
rb_scan_args(argc, argv, "02", &sqsum, &tilted_sum); rb_scan_args(argc, argv, "02", &need_sqsum, &need_tiled_sum);
CvSize size = cvSize(cvGetSize(CVARR(self)).width + 1, cvGetSize(CVARR(self)).height + 1); CvSize size = cvSize(cvGetSize(CVARR(self)).width + 1, cvGetSize(CVARR(self)).height + 1);
int cn = CV_MAT_CN(cvGetElemType(CVARR(self))); int cn = CV_MAT_CN(cvGetElemType(CVARR(self)));
sum = cCvMat::new_object(size, CV_MAKETYPE(CV_64F, cn)); VALUE sum = cCvMat::new_object(size, CV_MAKETYPE(CV_64F, cn));
sqsum = (sqsum == Qtrue ? cCvMat::new_object(size, CV_MAKETYPE(CV_64F, cn)) : Qnil); VALUE sqsum = (need_sqsum == Qtrue ? cCvMat::new_object(size, CV_MAKETYPE(CV_64F, cn)) : Qnil);
tilted_sum = (tilted_sum == Qtrue ? cCvMat::new_object(size, CV_MAKETYPE(CV_64F, cn)) : Qnil); VALUE tiled_sum = (need_tiled_sum == Qtrue ? cCvMat::new_object(size, CV_MAKETYPE(CV_64F, cn)) : Qnil);
cvIntegral(CVARR(self), CVARR(sum), NIL_P(sqsum) ? NULL : CVARR(sqsum), cvIntegral(CVARR(self), CVARR(sum), (need_sqsum == Qtrue) ? CVARR(sqsum) : NULL,
NIL_P(tilted_sum) ? NULL : CVARR(tilted_sum)); (need_tiled_sum == Qtrue) ? CVARR(tiled_sum) : NULL);
dest = rb_ary_new3(1, sum);
if(sqsum) if ((need_sqsum != Qtrue) && (need_tiled_sum != Qtrue))
rb_ary_push(dest, sqsum); return sum;
if(tilted_sum) else {
rb_ary_push(dest, tilted_sum); VALUE dest = rb_ary_new3(1, sum);
return dest; if (need_sqsum == Qtrue)
rb_ary_push(dest, sqsum);
if (need_tiled_sum == Qtrue)
rb_ary_push(dest, tiled_sum);
return dest;
}
} }
VALUE VALUE

View file

@ -1056,8 +1056,44 @@ class TestCvMat_imageprocessing < OpenCVTestCase
def test_integral def test_integral
mat0 = create_cvmat(3, 3, :cv8u, 1) { |j, i, n| CvScalar.new(n) } mat0 = create_cvmat(3, 3, :cv8u, 1) { |j, i, n| CvScalar.new(n) }
sum, sqsum, tilted_sum = mat0.integral(true, true) result_sum = []
[sum, sqsum, tilted_sum].each { |s| result_sqsum = []
result_tiled_sum = []
result1 = mat0.integral
assert_equal(CvMat, result1.class)
result_sum << result1
result2 = mat0.integral(true)
assert_equal(Array, result2.class)
assert_equal(2, result2.size)
assert(result2.all? {|a| a.class == CvMat})
result_sum << result2[0]
result_sqsum << result2[1]
result3 = mat0.integral(true, true)
assert_equal(Array, result3.class)
assert_equal(3, result3.size)
assert(result3.all? {|a| a.class == CvMat})
result_sum << result3[0]
result_sqsum << result3[1]
result_tiled_sum << result3[2]
result4 = mat0.integral(true, false)
assert_equal(Array, result4.class)
assert_equal(2, result4.size)
assert(result4.all? {|a| a.class == CvMat})
result_sum << result4[0]
result_sqsum << result4[1]
result5 = mat0.integral(false, true)
assert_equal(Array, result5.class)
assert_equal(2, result5.size)
assert(result5.all? {|a| a.class == CvMat})
result_sum << result5[0]
result_tiled_sum << result5[1]
(result_sum + result_sqsum + result_tiled_sum).each { |s|
assert_equal(mat0.height + 1, s.height) assert_equal(mat0.height + 1, s.height)
assert_equal(mat0.width + 1, s.width) assert_equal(mat0.width + 1, s.width)
assert_equal(:cv64f, s.depth) assert_equal(:cv64f, s.depth)
@ -1068,24 +1104,33 @@ class TestCvMat_imageprocessing < OpenCVTestCase
0, 0, 1, 3, 0, 0, 1, 3,
0, 3, 8, 15, 0, 3, 8, 15,
0, 9, 21, 36] 0, 9, 21, 36]
expected_sum.each_with_index { |x, i| result_sum.each { |sum|
assert_in_delta(x, sum[i][0], 0.001) expected_sum.each_with_index { |x, i|
assert_in_delta(x, sum[i][0], 0.001)
}
} }
expected_sqsum = [0, 0, 0, 0, expected_sqsum = [0, 0, 0, 0,
0, 0, 1, 5, 0, 0, 1, 5,
0, 9, 26, 55, 0, 9, 26, 55,
0, 45, 111, 204] 0, 45, 111, 204]
expected_sqsum.each_with_index { |x, i| result_sqsum.each { |sqsum|
assert_in_delta(x, sqsum[i][0], 0.001) expected_sqsum.each_with_index { |x, i|
assert_in_delta(x, sqsum[i][0], 0.001)
}
} }
expected_tilted_sum = [0, 0, 0, 0, expected_tilted_sum = [0, 0, 0, 0,
0, 0, 1, 2, 0, 0, 1, 2,
0, 4, 7, 8, 0, 4, 7, 8,
4, 16, 22, 20] 4, 16, 22, 20]
expected_tilted_sum.each_with_index { |x, i| result_tiled_sum.each { |tiled_sum|
assert_in_delta(x, tilted_sum[i][0], 0.001) expected_tilted_sum.each_with_index { |x, i|
assert_in_delta(x, tiled_sum[i][0], 0.001)
}
} }
mat0.integral(DUMMY_OBJ, DUMMY_OBJ)
end end
def test_threshold def test_threshold