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
 | 
