# Copyright 2014 The Chromium Authors. All rights reserved. # Use of this source code is governed by a BSD-style license that can be # found in the LICENSE file. import unittest from telemetry.internal.util import external_modules try: np = external_modules.ImportRequiredModule('numpy') except ImportError: pass else: class CVUtilTest(unittest.TestCase): def __init__(self, *args, **kwargs): super(CVUtilTest, self).__init__(*args, **kwargs) # Import modules with dependencies that may not be preset in test setup so # that importing this unit test doesn't cause the test runner to raise an # exception. from telemetry.internal.image_processing import cv_util self.cv_util = cv_util def testAreLinesOrthogonalish(self): l1 = np.asfarray((0, 0, 1, 0)) l2 = np.asfarray((0, 0, 0, 1)) self.assertTrue(self.cv_util.AreLinesOrthogonal(l1, l2, 0)) self.assertTrue(self.cv_util.AreLinesOrthogonal(l2, l1, 0)) self.assertFalse(self.cv_util.AreLinesOrthogonal(l1, l1, np.pi / 2 - 1e-10)) self.assertFalse(self.cv_util.AreLinesOrthogonal(l2, l2, np.pi / 2 - 1e-10)) self.assertTrue(self.cv_util.AreLinesOrthogonal(l1, l1, np.pi / 2)) self.assertTrue(self.cv_util.AreLinesOrthogonal(l2, l2, np.pi / 2)) l3 = np.asfarray((0, 0, 1, 1)) l4 = np.asfarray((1, 1, 0, 0)) self.assertFalse(self.cv_util.AreLinesOrthogonal(l3, l4, np.pi / 2 - 1e-10)) self.assertTrue(self.cv_util.AreLinesOrthogonal(l3, l1, np.pi / 4)) l5 = np.asfarray((0, 1, 1, 0)) self.assertTrue(self.cv_util.AreLinesOrthogonal(l3, l5, 0)) def testFindLineIntersection(self): l1 = np.asfarray((1, 1, 2, 1)) l2 = np.asfarray((1, 1, 1, 2)) ret, p = self.cv_util.FindLineIntersection(l1, l2) self.assertTrue(ret) self.assertTrue(np.array_equal(p, np.array([1, 1]))) l3 = np.asfarray((1.1, 1, 2, 1)) ret, p = self.cv_util.FindLineIntersection(l2, l3) self.assertFalse(ret) self.assertTrue(np.array_equal(p, np.array([1, 1]))) l4 = np.asfarray((2, 1, 1, 1)) l5 = np.asfarray((1, 2, 1, 1)) ret, p = self.cv_util.FindLineIntersection(l4, l5) self.assertTrue(ret) self.assertTrue(np.array_equal(p, np.array([1, 1]))) l6 = np.asfarray((1, 1, 0, 0)) l7 = np.asfarray((0, 1, 1, 0)) ret, p = self.cv_util.FindLineIntersection(l7, l6) self.assertTrue(ret) self.assertTrue(np.array_equal(p, np.array([0.5, 0.5]))) l8 = np.asfarray((0, 0, 0, 1)) l9 = np.asfarray((1, 0, 1, 1)) ret, p = self.cv_util.FindLineIntersection(l8, l9) self.assertFalse(ret) self.assertTrue(np.isnan(p[0])) def testExtendLines(self): l1 = (-1, 0, 1, 0) l2 = (0, -1, 0, 1) l3 = (4, 4, 6, 6) l4 = (1, 1, 1, 1) lines = self.cv_util.ExtendLines(np.asfarray([l1, l2, l3, l4], dtype=np.float64), 10) lines = np.around(lines, 10) expected0 = ((5.0, 0.0, -5.0, 0.0)) self.assertAlmostEqual(np.sum(np.abs(np.subtract(lines[0], expected0))), 0.0, 7) expected1 = ((0.0, 5.0, 0.0, -5.0)) self.assertAlmostEqual(np.sum(np.abs(np.subtract(lines[1], expected1))), 0.0, 7) off = np.divide(np.sqrt(50), 2, dtype=np.float64) expected2 = ((5 + off, 5 + off, 5 - off, 5 - off)) self.assertAlmostEqual(np.sum(np.abs(np.subtract(lines[2], expected2))), 0.0, 7) expected3 = ((-4, 1, 6, 1)) self.assertAlmostEqual(np.sum(np.abs(np.subtract(lines[3], expected3))), 0.0, 7) def testIsPointApproxOnLine(self): p1 = np.asfarray((-1, -1)) l1 = np.asfarray((0, 0, 100, 100)) p2 = np.asfarray((1, 2)) p3 = np.asfarray((2, 1)) p4 = np.asfarray((3, 1)) self.assertTrue(self.cv_util.IsPointApproxOnLine(p1, l1, 1 + 1e-7)) self.assertTrue(self.cv_util.IsPointApproxOnLine(p2, l1, 1 + 1e-7)) self.assertTrue(self.cv_util.IsPointApproxOnLine(p3, l1, 1 + 1e-7)) self.assertFalse(self.cv_util.IsPointApproxOnLine(p4, l1, 1 + 1e-7)) def testSqDistances(self): p1 = np.array([[0, 2], [0, 3]]) p2 = np.array([2, 0]) dists = self.cv_util.SqDistance(p1, p2) self.assertEqual(dists[0], 8) self.assertEqual(dists[1], 13) def testSqDistance(self): p1 = np.array([0, 2]) p2 = np.array([2, 0]) self.assertEqual(self.cv_util.SqDistance(p1, p2), 8)