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:
parent
79e9e17844
commit
366e9e2bc0
2 changed files with 71 additions and 21 deletions
|
@ -3960,21 +3960,26 @@ rb_copy_make_border_replicate(int argc, VALUE *argv, VALUE self)
|
|||
VALUE
|
||||
rb_integral(int argc, VALUE *argv, VALUE self)
|
||||
{
|
||||
VALUE sum, sqsum, tilted_sum, dest;
|
||||
rb_scan_args(argc, argv, "02", &sqsum, &tilted_sum);
|
||||
VALUE need_sqsum = Qfalse, need_tiled_sum = Qfalse;
|
||||
rb_scan_args(argc, argv, "02", &need_sqsum, &need_tiled_sum);
|
||||
CvSize size = cvSize(cvGetSize(CVARR(self)).width + 1, cvGetSize(CVARR(self)).height + 1);
|
||||
int cn = CV_MAT_CN(cvGetElemType(CVARR(self)));
|
||||
sum = cCvMat::new_object(size, CV_MAKETYPE(CV_64F, cn));
|
||||
sqsum = (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);
|
||||
cvIntegral(CVARR(self), CVARR(sum), NIL_P(sqsum) ? NULL : CVARR(sqsum),
|
||||
NIL_P(tilted_sum) ? NULL : CVARR(tilted_sum));
|
||||
dest = rb_ary_new3(1, sum);
|
||||
if(sqsum)
|
||||
VALUE sum = cCvMat::new_object(size, CV_MAKETYPE(CV_64F, cn));
|
||||
VALUE sqsum = (need_sqsum == 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), (need_sqsum == Qtrue) ? CVARR(sqsum) : NULL,
|
||||
(need_tiled_sum == Qtrue) ? CVARR(tiled_sum) : NULL);
|
||||
|
||||
if ((need_sqsum != Qtrue) && (need_tiled_sum != Qtrue))
|
||||
return sum;
|
||||
else {
|
||||
VALUE dest = rb_ary_new3(1, sum);
|
||||
if (need_sqsum == Qtrue)
|
||||
rb_ary_push(dest, sqsum);
|
||||
if(tilted_sum)
|
||||
rb_ary_push(dest, tilted_sum);
|
||||
if (need_tiled_sum == Qtrue)
|
||||
rb_ary_push(dest, tiled_sum);
|
||||
return dest;
|
||||
}
|
||||
}
|
||||
|
||||
VALUE
|
||||
|
|
|
@ -1056,8 +1056,44 @@ class TestCvMat_imageprocessing < OpenCVTestCase
|
|||
def test_integral
|
||||
mat0 = create_cvmat(3, 3, :cv8u, 1) { |j, i, n| CvScalar.new(n) }
|
||||
|
||||
sum, sqsum, tilted_sum = mat0.integral(true, true)
|
||||
[sum, sqsum, tilted_sum].each { |s|
|
||||
result_sum = []
|
||||
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.width + 1, s.width)
|
||||
assert_equal(:cv64f, s.depth)
|
||||
|
@ -1068,24 +1104,33 @@ class TestCvMat_imageprocessing < OpenCVTestCase
|
|||
0, 0, 1, 3,
|
||||
0, 3, 8, 15,
|
||||
0, 9, 21, 36]
|
||||
result_sum.each { |sum|
|
||||
expected_sum.each_with_index { |x, i|
|
||||
assert_in_delta(x, sum[i][0], 0.001)
|
||||
}
|
||||
}
|
||||
|
||||
expected_sqsum = [0, 0, 0, 0,
|
||||
0, 0, 1, 5,
|
||||
0, 9, 26, 55,
|
||||
0, 45, 111, 204]
|
||||
result_sqsum.each { |sqsum|
|
||||
expected_sqsum.each_with_index { |x, i|
|
||||
assert_in_delta(x, sqsum[i][0], 0.001)
|
||||
}
|
||||
}
|
||||
|
||||
expected_tilted_sum = [0, 0, 0, 0,
|
||||
0, 0, 1, 2,
|
||||
0, 4, 7, 8,
|
||||
4, 16, 22, 20]
|
||||
result_tiled_sum.each { |tiled_sum|
|
||||
expected_tilted_sum.each_with_index { |x, i|
|
||||
assert_in_delta(x, tilted_sum[i][0], 0.001)
|
||||
assert_in_delta(x, tiled_sum[i][0], 0.001)
|
||||
}
|
||||
}
|
||||
|
||||
mat0.integral(DUMMY_OBJ, DUMMY_OBJ)
|
||||
end
|
||||
|
||||
def test_threshold
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue