mirror of
https://github.com/opencv/opencv.git
synced 2024-12-26 18:58:16 +08:00
167 lines
5.3 KiB
Matlab
167 lines
5.3 KiB
Matlab
% Matlab binding test cases
|
|
% Uses Matlab's builtin testing framework
|
|
classdef OpenCVTest < matlab.unittest.TestCase
|
|
|
|
methods(Test)
|
|
|
|
% -------------------------------------------------------------------------
|
|
% EXCEPTIONS
|
|
% Check that errors and exceptions are thrown correctly
|
|
% -------------------------------------------------------------------------
|
|
|
|
% check that std exception is thrown
|
|
function stdException(testcase)
|
|
try
|
|
std_exception();
|
|
testcase.verifyFail();
|
|
catch
|
|
% TODO: Catch more specific exception
|
|
testcase.verifyTrue(true);
|
|
end
|
|
end
|
|
|
|
% check that OpenCV exceptions are correctly caught
|
|
function cvException(testcase)
|
|
try
|
|
cv_exception();
|
|
testcase.verifyFail();
|
|
catch
|
|
% TODO: Catch more specific exception
|
|
testcase.verifyTrue(true);
|
|
end
|
|
end
|
|
|
|
% check that all exceptions are caught
|
|
function allException(testcase)
|
|
try
|
|
exception();
|
|
testcase.verifyFail();
|
|
catch
|
|
% TODO: Catch more specific exception
|
|
testcase.verifyTrue(true);
|
|
end
|
|
end
|
|
|
|
% -------------------------------------------------------------------------
|
|
% SIZES AND FILLS
|
|
% Check that matrices are correctly filled and resized
|
|
% -------------------------------------------------------------------------
|
|
|
|
% check that a matrix is correctly filled with random numbers
|
|
function randomFill(testcase)
|
|
sz = [7 11];
|
|
mat = zeros(sz);
|
|
mat = cv.randn(mat, 0, 1);
|
|
testcase.verifyEqual(size(mat), sz, 'Matrix should not change size');
|
|
testcase.verifyNotEqual(mat, zeros(sz), 'Matrix should be nonzero');
|
|
end
|
|
|
|
function transpose(testcase)
|
|
m = randn(19, 81);
|
|
mt1 = transpose(m);
|
|
mt2 = cv.transpose(m);
|
|
testcase.verifyEqual(size(mt1), size(mt2), 'Matrix transposed to incorrect dimensionality');
|
|
testcase.verifyLessThan(norm(mt1 - mt2), 1e-8, 'Too much precision lost in tranposition');
|
|
end
|
|
|
|
% multiple return
|
|
function multipleReturn(testcase)
|
|
A = randn(10);
|
|
A = A'*A;
|
|
[V1, D1] = eig(A); D1 = diag(D1);
|
|
[~, D2, V2] = cv.eigen(A);
|
|
testcase.verifyLessThan(norm(V1 - V2), 1e-6, 'Too much precision lost in eigenvectors');
|
|
testcase.verifyLessThan(norm(D1 - D2), 1e-6, 'Too much precision lost in eigenvalues');
|
|
end
|
|
|
|
% complex output from SVD
|
|
function complexOutputSVD(testcase)
|
|
A = randn(10);
|
|
[V1, D1] = eig(A);
|
|
[~, D2, V2] = cv.eigen(A);
|
|
testcase.verifyTrue(~isreal(V2) && size(V2,3) == 1, 'Output should be complex');
|
|
testcase.verifyLessThan(norm(V1 - V2), 1e-6, 'Too much precision lost in eigenvectors');
|
|
end
|
|
|
|
% complex output from Fourier Transform
|
|
function complexOutputFFT(testcase)
|
|
A = randn(10);
|
|
F1 = fft2(A);
|
|
F2 = cv.dft(A, cv.DFT_COMPLEX_OUTPUT);
|
|
testcase.verifyTrue(~isreal(F2) && size(F2,3) == 1, 'Output should be complex');
|
|
testcase.verifyLessThan(norm(F1 - F2), 1e-6, 'Too much precision lost in eigenvectors');
|
|
end
|
|
|
|
% -------------------------------------------------------------------------
|
|
% TYPE CASTS
|
|
% Check that types are correctly cast
|
|
% -------------------------------------------------------------------------
|
|
|
|
% -------------------------------------------------------------------------
|
|
% PRECISION
|
|
% Check that basic operations are performed with sufficient precision
|
|
% -------------------------------------------------------------------------
|
|
|
|
% check that summing elements is within reasonable precision
|
|
function sumElements(testcase)
|
|
a = randn(5000);
|
|
b = sum(a(:));
|
|
c = cv.sum(a);
|
|
testcase.verifyLessThan(norm(b - c), 1e-8, 'Matrix reduction with insufficient precision');
|
|
end
|
|
|
|
|
|
% check that adding two matrices is within reasonable precision
|
|
function addPrecision(testcase)
|
|
a = randn(50);
|
|
b = randn(50);
|
|
c = a+b;
|
|
d = cv.add(a, b);
|
|
testcase.verifyLessThan(norm(c - d), 1e-8, 'Matrices are added with insufficient precision');
|
|
end
|
|
|
|
% check that performing gemm is within reasonable precision
|
|
function gemmPrecision(testcase)
|
|
a = randn(10, 50);
|
|
b = randn(50, 10);
|
|
c = randn(10, 10);
|
|
alpha = 2.71828;
|
|
gamma = 1.61803;
|
|
d = alpha*a*b + gamma*c;
|
|
e = cv.gemm(a, b, alpha, c, gamma);
|
|
testcase.verifyLessThan(norm(d - e), 1e-8, 'Matrices are multiplied with insufficient precision');
|
|
end
|
|
|
|
|
|
% -------------------------------------------------------------------------
|
|
% MISCELLANEOUS
|
|
% Miscellaneous tests
|
|
% -------------------------------------------------------------------------
|
|
|
|
% check that cv::waitKey waits for at least specified time
|
|
function waitKey(testcase)
|
|
tic();
|
|
cv.waitKey(500);
|
|
elapsed = toc();
|
|
testcase.verifyGreaterThan(elapsed, 0.5, 'Elapsed time should be at least 0.5 seconds');
|
|
end
|
|
|
|
% check that highgui window can be created and destroyed
|
|
function createAndDestroyWindow(testcase)
|
|
try
|
|
cv.namedWindow('test window');
|
|
catch
|
|
testcase.verifyFail('could not create window');
|
|
end
|
|
|
|
try
|
|
cv.destroyWindow('test window');
|
|
catch
|
|
testcase.verifyFail('could not destroy window');
|
|
end
|
|
testcase.verifyTrue(true);
|
|
end
|
|
|
|
end
|
|
end
|