2011-10-22 17:15:31 -04:00
|
|
|
#!/usr/bin/env ruby
|
|
|
|
# -*- mode: ruby; coding: utf-8-unix -*-
|
|
|
|
require 'test/unit'
|
|
|
|
require 'opencv'
|
|
|
|
require File.expand_path(File.dirname(__FILE__)) + '/helper'
|
|
|
|
|
|
|
|
include OpenCV
|
|
|
|
|
|
|
|
# Tests for OpenCV::CvHistogram
|
|
|
|
class TestCvHistogram < OpenCVTestCase
|
|
|
|
def setup
|
|
|
|
@img = IplImage.load(FILENAME_LENA32x32, 0)
|
|
|
|
|
|
|
|
dim = 1
|
|
|
|
sizes = [8]
|
|
|
|
ranges = [[0, 255]]
|
|
|
|
@hist1 = CvHistogram.new(dim, sizes, CV_HIST_ARRAY, ranges, true).calc_hist!([@img])
|
|
|
|
|
|
|
|
dim = 2
|
|
|
|
sizes = [8, 16]
|
|
|
|
ranges = [[0, 255], [0, 255]]
|
|
|
|
@hist2 = CvHistogram.new(dim, sizes, CV_HIST_SPARSE, ranges, true).calc_hist!([@img, @img])
|
|
|
|
end
|
|
|
|
|
|
|
|
def teardown
|
|
|
|
@hist1 = nil
|
|
|
|
@hist2 = nil
|
|
|
|
GC.start
|
|
|
|
end
|
|
|
|
|
|
|
|
def test_initialize
|
|
|
|
dim = 1
|
|
|
|
sizes = [256]
|
|
|
|
ranges = [[0, 256]]
|
|
|
|
hist1 = CvHistogram.new(dim, sizes, CV_HIST_ARRAY, ranges, true)
|
|
|
|
hist2 = CvHistogram.new(dim, sizes, CV_HIST_ARRAY)
|
|
|
|
hist3 = CvHistogram.new(dim, sizes, CV_HIST_ARRAY, nil)
|
|
|
|
hist4 = CvHistogram.new(dim, sizes, CV_HIST_ARRAY, nil, false)
|
|
|
|
end
|
|
|
|
|
|
|
|
def test_is_uniform
|
|
|
|
assert(@hist1.is_uniform?)
|
|
|
|
assert(@hist2.is_uniform?)
|
|
|
|
end
|
|
|
|
|
|
|
|
def test_is_sparse
|
|
|
|
assert_false(@hist1.is_sparse?)
|
|
|
|
assert(@hist2.is_sparse?)
|
|
|
|
end
|
|
|
|
|
|
|
|
def test_has_range
|
|
|
|
assert(@hist1.has_range?)
|
|
|
|
assert(@hist2.has_range?)
|
|
|
|
end
|
|
|
|
|
|
|
|
def test_calc_hist
|
|
|
|
img = IplImage.new(1, 1, :cv8u, 1)
|
|
|
|
assert_equal(CvHistogram, @hist1.calc_hist([img]).class)
|
|
|
|
assert_equal(CvHistogram, @hist1.calc_hist([img, img]).class)
|
|
|
|
assert_equal(CvHistogram, @hist1.calc_hist([img], true).class)
|
|
|
|
assert_equal(CvHistogram, @hist1.calc_hist([img, img], false).class)
|
|
|
|
mask = CvMat.new(1, 1, :cv8u, 1)
|
|
|
|
assert_equal(CvHistogram, @hist1.calc_hist([img], true, mask).class)
|
|
|
|
|
|
|
|
assert_raise(TypeError) {
|
|
|
|
@hist1.calc_hist(img)
|
|
|
|
}
|
|
|
|
assert_raise(TypeError) {
|
|
|
|
@hist1.calc_hist([DUMMY_OBJ])
|
|
|
|
}
|
|
|
|
assert_raise(TypeError) {
|
|
|
|
@hist1.calc_hist(nil)
|
|
|
|
}
|
|
|
|
assert_raise(TypeError) {
|
|
|
|
@hist1.calc_hist([img], true, DUMMY_OBJ)
|
|
|
|
}
|
|
|
|
assert_raise(CvStsBadArg) {
|
|
|
|
@hist1.calc_hist([])
|
|
|
|
}
|
|
|
|
end
|
|
|
|
|
|
|
|
def test_aref
|
|
|
|
expected = [0.0, 102.0, 189.0, 244.0, 285.0, 140.0, 64.0, 0.0]
|
|
|
|
expected.each_with_index { |x, i|
|
|
|
|
assert_in_delta(x, @hist1[i], 0.001)
|
|
|
|
assert_in_delta(x, @hist1.query_hist_value(i), 0.001)
|
|
|
|
}
|
|
|
|
end
|
|
|
|
|
|
|
|
def test_min_max_value
|
|
|
|
min, max, min_loc, max_loc = @hist1.min_max_value
|
|
|
|
assert_in_delta(0.0, min, 0.001)
|
|
|
|
assert_in_delta(285.0, max, 0.001)
|
|
|
|
assert_equal(Array, min_loc.class)
|
|
|
|
assert_equal(Array, max_loc.class)
|
|
|
|
assert_equal(1, min_loc.size)
|
|
|
|
assert_equal(1, max_loc.size)
|
|
|
|
assert_equal(0, min_loc[0])
|
|
|
|
assert_equal(4, max_loc[0])
|
|
|
|
|
|
|
|
min, max, min_loc, max_loc = @hist2.min_max_value
|
|
|
|
assert_in_delta(14.0, min, 0.001)
|
|
|
|
assert_in_delta(158.0, max, 0.001)
|
|
|
|
assert_equal(Array, min_loc.class)
|
|
|
|
assert_equal(Array, max_loc.class)
|
|
|
|
assert_equal(2, min_loc.size)
|
|
|
|
assert_equal(2, max_loc.size)
|
|
|
|
assert_equal(1, min_loc[0])
|
|
|
|
assert_equal(2, min_loc[1])
|
|
|
|
assert_equal(4, max_loc[0])
|
|
|
|
assert_equal(9, max_loc[1])
|
|
|
|
end
|
|
|
|
|
|
|
|
def test_dims
|
|
|
|
dims, sizes = @hist1.dims
|
|
|
|
assert_equal(1, dims)
|
|
|
|
assert_equal(Array, sizes.class)
|
|
|
|
assert_equal(1, sizes.size)
|
|
|
|
assert_equal(8, sizes[0])
|
|
|
|
|
|
|
|
dims, sizes = @hist2.dims
|
|
|
|
assert_equal(2, dims)
|
|
|
|
assert_equal(Array, sizes.class)
|
|
|
|
assert_equal(2, sizes.size)
|
|
|
|
assert_equal(8, sizes[0])
|
|
|
|
assert_equal(16, sizes[1])
|
|
|
|
end
|
|
|
|
|
|
|
|
def test_copy_hist
|
|
|
|
expected = [0.0, 102.0, 189.0, 244.0, 285.0, 140.0, 64.0, 0.0]
|
|
|
|
hist = @hist1.copy_hist
|
|
|
|
expected.each_with_index { |x, i|
|
|
|
|
assert_in_delta(x, hist[i], 0.001)
|
|
|
|
assert_in_delta(x, hist.query_hist_value(i), 0.001)
|
|
|
|
}
|
|
|
|
end
|
|
|
|
|
|
|
|
def test_clear_hist
|
|
|
|
@hist1.clear_hist!
|
|
|
|
dims, sizes = @hist1.dims
|
|
|
|
dims.times { |i|
|
|
|
|
assert_in_delta(0.0, @hist1[i], 0.001)
|
|
|
|
}
|
|
|
|
end
|
|
|
|
|
|
|
|
def test_normalize_hist
|
|
|
|
@hist1.normalize_hist!(100)
|
|
|
|
expected = [0.0, 9.96, 18.46, 23.83, 27.83, 13.67, 6.25, 0.0]
|
|
|
|
expected.each_with_index { |x, i|
|
|
|
|
assert_in_delta(x, @hist1[i], 0.01)
|
|
|
|
}
|
|
|
|
end
|
|
|
|
|
|
|
|
def test_thresh_hist
|
|
|
|
@hist1.thresh_hist!(150)
|
|
|
|
expected = [0.0, 0.0, 189.0, 244.0, 285.0, 0.0, 0.0, 0.0]
|
|
|
|
expected.each_with_index { |x, i|
|
|
|
|
assert_in_delta(x, @hist1[i], 0.001)
|
|
|
|
}
|
|
|
|
end
|
|
|
|
|
|
|
|
def test_set_hist_bin_ranges
|
|
|
|
dim = 1
|
|
|
|
sizes = [8]
|
|
|
|
|
|
|
|
hist = CvHistogram.new(dim, sizes, CV_HIST_ARRAY)
|
|
|
|
assert_false(hist.has_range?)
|
|
|
|
assert(hist.is_uniform?)
|
|
|
|
|
|
|
|
ranges = [[0, 255]]
|
|
|
|
hist.set_hist_bin_ranges!(ranges, true)
|
|
|
|
assert(hist.has_range?)
|
|
|
|
assert(hist.is_uniform?)
|
|
|
|
|
|
|
|
assert_raise(TypeError) {
|
|
|
|
hist.set_hist_bin_ranges!(DUMMY_OBJ)
|
|
|
|
}
|
|
|
|
assert_raise(TypeError) {
|
|
|
|
hist.set_hist_bin_ranges!([DUMMY_OBJ])
|
|
|
|
}
|
|
|
|
end
|
|
|
|
|
|
|
|
def test_calc_back_project
|
|
|
|
back_project = @hist1.calc_back_project([@img])
|
|
|
|
assert_equal(@img.class, back_project.class)
|
|
|
|
assert_equal('2a0097af1ab4f9343e4feaae3a780c93', hash_img(back_project))
|
|
|
|
|
|
|
|
assert_raise(TypeError) {
|
|
|
|
@hist1.calc_back_project(DUMMY_OBJ)
|
|
|
|
}
|
|
|
|
assert_raise(TypeError) {
|
|
|
|
@hist1.calc_back_project([DUMMY_OBJ])
|
|
|
|
}
|
|
|
|
end
|
|
|
|
|
|
|
|
def test_calc_back_project_patch
|
|
|
|
img = IplImage.load(FILENAME_LENA256x256, 0)
|
|
|
|
template = IplImage.load(FILENAME_LENA_EYES, 0)
|
|
|
|
|
|
|
|
dim = 1
|
|
|
|
sizes = [8]
|
|
|
|
ranges = [[0, 255]]
|
|
|
|
hist = CvHistogram.new(dim, sizes, CV_HIST_ARRAY, ranges).calc_hist!([template])
|
|
|
|
back_project = hist.calc_back_project_patch([img], template.size, CV_COMP_CORREL, 1.0)
|
|
|
|
assert_equal('e6497e45c6f2f715328bbc2fefe31581', hash_img(back_project))
|
|
|
|
|
|
|
|
assert_raise(TypeError) {
|
|
|
|
hist.calc_back_project_patch(DUMMY_OBJ, template.size, CV_COMP_CORREL, 1.0)
|
|
|
|
}
|
|
|
|
assert_raise(TypeError) {
|
|
|
|
hist.calc_back_project_patch([DUMMY_OBJ], template.size, CV_COMP_CORREL, 1.0)
|
|
|
|
}
|
|
|
|
|
|
|
|
# Uncomment the following line to show the result
|
|
|
|
# min_val, max_val, min_loc, max_loc = back_project.min_max_loc
|
|
|
|
# result = img.rectangle(max_loc, CvPoint.new(max_loc.x + template.width, max_loc.y + template.height),
|
|
|
|
# :thickness => 2)
|
|
|
|
# snap img, template, back_project, result
|
|
|
|
end
|
|
|
|
|
|
|
|
def test_compare_hist
|
|
|
|
img = IplImage.load(FILENAME_CAT, 0)
|
|
|
|
dim, sizes = @hist1.dims
|
|
|
|
ranges = [[0, 255]]
|
|
|
|
hist = CvHistogram.new(dim, sizes, CV_HIST_ARRAY, ranges).calc_hist!([img])
|
|
|
|
|
2012-11-06 13:02:58 -05:00
|
|
|
assert_in_delta(0.7446, CvHistogram.compare_hist(@hist1, hist, CV_COMP_CORREL), 0.1)
|
|
|
|
assert_in_delta(30250343.0, CvHistogram.compare_hist(@hist1, hist, CV_COMP_CHISQR), 1.0)
|
2011-10-22 17:15:31 -04:00
|
|
|
assert_in_delta(1024.0, CvHistogram.compare_hist(@hist1, hist, CV_COMP_INTERSECT), 1.0)
|
2012-11-06 13:02:58 -05:00
|
|
|
assert_in_delta(0.2955, CvHistogram.compare_hist(@hist1, hist, CV_COMP_BHATTACHARYYA), 0.1)
|
2011-10-22 17:15:31 -04:00
|
|
|
|
|
|
|
assert_raise(TypeError) {
|
|
|
|
CvHistogram.compare_hist(DUMMY_OBJ, hist, CV_COMP_CORREL)
|
|
|
|
}
|
|
|
|
assert_raise(TypeError) {
|
|
|
|
CvHistogram.compare_hist(@hist1, DUMMY_OBJ, CV_COMP_CORREL)
|
|
|
|
}
|
|
|
|
assert_raise(TypeError) {
|
|
|
|
CvHistogram.compare_hist(@hist1, hist, DUMMY_OBJ)
|
|
|
|
}
|
|
|
|
end
|
|
|
|
|
|
|
|
def test_calc_prob_density
|
|
|
|
img = IplImage.load(FILENAME_CAT, 0)
|
|
|
|
dim, sizes = @hist1.dims
|
|
|
|
ranges = [[0, 255]]
|
|
|
|
hist = CvHistogram.new(dim, sizes, CV_HIST_ARRAY, ranges).calc_hist!([img])
|
|
|
|
dst = CvHistogram.calc_prob_density(hist, @hist1)
|
|
|
|
|
|
|
|
assert_equal(CvHistogram, dst.class)
|
|
|
|
dim, sizes = dst.dims
|
|
|
|
expected_dim, expected_sizes = @hist1.dims
|
|
|
|
assert_equal(expected_dim, dim)
|
|
|
|
expected_sizes.each_with_index { |x, i|
|
|
|
|
assert_equal(x, sizes[i])
|
|
|
|
}
|
|
|
|
|
|
|
|
expected = [0.0, 1.437, 1.135, 1.092, 2.323, 3.712, 3.103, 0.0]
|
|
|
|
expected.each_with_index { |x, i|
|
|
|
|
assert_in_delta(x, dst[i], 0.001)
|
|
|
|
}
|
|
|
|
|
|
|
|
assert_raise(TypeError) {
|
|
|
|
CvHistogram.calc_prob_density(DUMMY_OBJ, @hist1)
|
|
|
|
}
|
|
|
|
assert_raise(TypeError) {
|
|
|
|
CvHistogram.calc_prob_density(hist, DUMMY_OBJ)
|
|
|
|
}
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|