From 2a256fda4ae69cf6beb91de502b49c8da7f583b6 Mon Sep 17 00:00:00 2001 From: ser1zw Date: Thu, 13 Jan 2011 02:16:08 +0900 Subject: [PATCH] added tests for CvMat#dft and CvMat#dct --- test/test_cvmat_dxt.rb | 139 +++++++++++++++++++++++++++++++++++++++++ 1 file changed, 139 insertions(+) create mode 100755 test/test_cvmat_dxt.rb diff --git a/test/test_cvmat_dxt.rb b/test/test_cvmat_dxt.rb new file mode 100755 index 0000000..52413fd --- /dev/null +++ b/test/test_cvmat_dxt.rb @@ -0,0 +1,139 @@ +#!/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 dft and dct functions of OpenCV::CvMat +class TestCvMat_dxt < OpenCVTestCase + def test_dft_1D + n = 32 + w = 2 * Math::PI / n + + mat0 = create_cvmat(n, 1, :cv32f, 2) { |j, i, c| + s = Math.sin(c * w) + CvScalar.new(s, s) + } + + mat1 = mat0.dft(:forward) + mat2 = mat0.dft(:forward, :scale) + mat3 = mat0.dft(:forward, :scale).dft(:inverse) + n.times { |j| + if j == 1 + assert_in_delta(n / 2, mat1[j, 0][0], 0.001) + assert_in_delta(-n / 2, mat1[j, 0][1], 0.001) + assert_in_delta(0.5, mat2[j, 0][0], 0.001) + assert_in_delta(-0.5, mat2[j, 0][1], 0.001) + elsif j == n - 1 + assert_in_delta(-n / 2, mat1[j, 0][0], 0.001) + assert_in_delta(n / 2, mat1[j, 0][1], 0.001) + assert_in_delta(-0.5, mat2[j, 0][0], 0.001) + assert_in_delta(0.5, mat2[j, 0][1], 0.001) + else + assert_in_delta(0, mat1[j, 0][0], 0.001) + assert_in_delta(0, mat1[j, 0][1], 0.001) + assert_in_delta(0, mat2[j, 0][0], 0.001) + assert_in_delta(0, mat2[j, 0][1], 0.001) + end + assert_in_delta(mat0[j, 0][0], mat3[j, 0][0], 0.001) + assert_in_delta(mat0[j, 0][1], mat3[j, 0][1], 0.001) + } + end + + def test_dft_2D + n = 32 + w = 2 * Math::PI / n + c = 0 + mat0 = CvMat.new(n, n, :cv32f, 2) + n.times { |j| + s = Math.sin(c * w) + n.times { |i| + mat0[j, i] = CvScalar.new(s, s) + } + c += 1 + } + + mat1 = mat0.dft(:forward) + mat2 = mat0.dft(:forward, :scale) + mat3 = mat0.dft(:forward, :scale).dft(:inverse) + n.times { |j| + n.times { |i| + if i == 0 and j == 1 + assert_in_delta(n * n / 2, mat1[j, i][0], 0.001) + assert_in_delta(-n * n / 2, mat1[j, i][1], 0.001) + assert_in_delta(0.5, mat2[j, i][0], 0.001) + assert_in_delta(-0.5, mat2[j, i][1], 0.001) + elsif i == 0 and j == n - 1 + assert_in_delta(-n * n / 2, mat1[j, i][0], 0.001) + assert_in_delta(n * n / 2, mat1[j, i][1], 0.001) + assert_in_delta(-0.5, mat2[j, i][0], 0.001) + assert_in_delta(0.5, mat2[j, i][1], 0.001) + else + assert_in_delta(0, mat1[j, i][0], 0.001) + assert_in_delta(0, mat1[j, i][1], 0.001) + assert_in_delta(0, mat2[j, i][0], 0.001) + assert_in_delta(0, mat2[j, i][1], 0.001) + end + assert_in_delta(mat0[j, 0][0], mat3[j, i][0], 0.001) + assert_in_delta(mat0[j, 0][1], mat3[j, i][1], 0.001) + } + } + end + + def test_dct_1D + n = 8 + w = 2 * Math::PI / n + + mat0 = create_cvmat(n, 1, :cv32f, 1) { |j, i, c| + s = Math.sin(c * w) + CvScalar.new(s) + } + + mat1 = mat0.dct + mat2 = mat0.dct(:forward).dct(:inverse) + expected1 = [0, 1.599647, -0.765367, -0.906127, 0, -0.180240, 0, -0.042290] + n.times { |j| + assert_in_delta(expected1[j], mat1[j, 0][0], 0.001) + assert_in_delta(mat0[j, 0][0], mat2[j, 0][0], 0.001) + } + end + + def test_dct_2D + n = 8 + w = 2 * Math::PI / n + c = 0 + mat0 = CvMat.new(n, n, :cv32f, 1) + n.times { |j| + s = Math.sin(c * w) + n.times { |i| + mat0[j, i] = CvScalar.new(s, s) + } + c += 1 + } + + mat1 = mat0.dct(:forward) + mat2 = mat0.dct(:forward).dct(:inverse) + n.times { |j| + n.times { |i| + if i == 0 and j == 1 + assert_in_delta(4.524486, mat1[j, i][0], 0.001) + elsif i == 0 and j == 2 + assert_in_delta(-2.164784, mat1[j, i][0], 0.001) + elsif i == 0 and j == 3 + assert_in_delta(-2.562915, mat1[j, i][0], 0.001) + elsif i == 0 and j == 5 + assert_in_delta(-0.509796, mat1[j, i][0], 0.001) + elsif i == 0 and j == 7 + assert_in_delta(-0.119615, mat1[j, i][0], 0.001) + else + assert_in_delta(0, mat1[j, i][0], 0.001) + end + assert_in_delta(mat0[j, i][0], mat2[j, i][0], 0.001) + } + } + end +end + +