diff --git a/modules/core/src/matrix.cpp b/modules/core/src/matrix.cpp index 7f1dfe690..d52c2a709 100644 --- a/modules/core/src/matrix.cpp +++ b/modules/core/src/matrix.cpp @@ -5211,7 +5211,7 @@ RotatedRect::RotatedRect(const Point2f& _point1, const Point2f& _point2, const P vecs[0] = Vec2f(_point1 - _point2); vecs[1] = Vec2f(_point2 - _point3); // check that given sides are perpendicular - CV_Assert( abs(vecs[0].dot(vecs[1])) <= 0.001 ); + CV_Assert( abs(vecs[0].dot(vecs[1])) <= FLT_EPSILON ); // wd_i stores which vector (0,1) or (1,2) will make the width // One of them will definitely have slope within -1 to 1 diff --git a/modules/core/test/test_io.cpp b/modules/core/test/test_io.cpp index 71c739154..23c0aad62 100644 --- a/modules/core/test/test_io.cpp +++ b/modules/core/test/test_io.cpp @@ -403,7 +403,6 @@ protected: Size s1(6, 7), os1; Complex c1(9, 10), oc1; Rect r1(11, 12, 13, 14), or1; - RotatedRect rr1(Point2f(0,0), Point2f(100,100), Point2f(50, 150)); Vec v1(15, 16, 17, 18, 19), ov1; Scalar sc1(20.0, 21.1, 22.2, 23.3), osc1; Range g1(7, 8), og1; diff --git a/modules/core/test/test_rotatedrect.cpp b/modules/core/test/test_rotatedrect.cpp new file mode 100644 index 000000000..a163f30d1 --- /dev/null +++ b/modules/core/test/test_rotatedrect.cpp @@ -0,0 +1,107 @@ +/*M/////////////////////////////////////////////////////////////////////////////////////// +// +// IMPORTANT: READ BEFORE DOWNLOADING, COPYING, INSTALLING OR USING. +// +// By downloading, copying, installing or using the software you agree to this license. +// If you do not agree to this license, do not download, install, +// copy or use the software. +// +// +// Intel License Agreement +// For Open Source Computer Vision Library +// +// Copyright (C) 2000, Intel Corporation, all rights reserved. +// Third party copyrights are property of their respective owners. +// +// Redistribution and use in source and binary forms, with or without modification, +// are permitted provided that the following conditions are met: +// +// * Redistribution's of source code must retain the above copyright notice, +// this list of conditions and the following disclaimer. +// +// * Redistribution's in binary form must reproduce the above copyright notice, +// this list of conditions and the following disclaimer in the documentation +// and/or other materials provided with the distribution. +// +// * The name of Intel Corporation may not be used to endorse or promote products +// derived from this software without specific prior written permission. +// +// This software is provided by the copyright holders and contributors "as is" and +// any express or implied warranties, including, but not limited to, the implied +// warranties of merchantability and fitness for a particular purpose are disclaimed. +// In no event shall the Intel Corporation or contributors be liable for any direct, +// indirect, incidental, special, exemplary, or consequential damages +// (including, but not limited to, procurement of substitute goods or services; +// loss of use, data, or profits; or business interruption) however caused +// and on any theory of liability, whether in contract, strict liability, +// or tort (including negligence or otherwise) arising in any way out of +// the use of this software, even if advised of the possibility of such damage. +// +//M*/ + +#include "test_precomp.hpp" + +using namespace cv; +using namespace std; + +class Core_RotatedRectConstructorTest : public cvtest::BaseTest +{ +public: + Core_RotatedRectConstructorTest(); +protected: + int prepare_test_case( int ); + void run_func(); + int validate_test_results( int ); + const static int MAX_COORD_VAL = 1000; + Point2f a, b, c; + RotatedRect rec; +}; + +Core_RotatedRectConstructorTest::Core_RotatedRectConstructorTest() +{ + test_case_count = 100; +} + +int Core_RotatedRectConstructorTest::prepare_test_case( int test_case_idx ) +{ + cvtest::BaseTest::prepare_test_case( test_case_idx ); + RNG& rng = ts->get_rng(); + a = Point2f( (float) (cvtest::randInt(rng) % MAX_COORD_VAL), (float) (cvtest::randInt(rng) % MAX_COORD_VAL) ); + b = Point2f( (float) (cvtest::randInt(rng) % MAX_COORD_VAL) , (float) (cvtest::randInt(rng) % MAX_COORD_VAL) ); + // to ensure a != b + while( norm(a - b) == 0 ) { + b = Point2f( (float) (cvtest::randInt(rng) % MAX_COORD_VAL) , (float) (cvtest::randInt(rng) % MAX_COORD_VAL) ); + } + Vec2f along(a - b); + Vec2f perp = Vec2f(-along[1], along[0]); + float d = (float) (cvtest::randInt(rng) % MAX_COORD_VAL) + 1.0f; // c can't be same as b, so d must be > 0 + c = Point2f( b.x + d * perp[0], b.y + d * perp[1] ); + return 1; +} + +void Core_RotatedRectConstructorTest::run_func() +{ + rec = RotatedRect(a, b, c); +} + +int Core_RotatedRectConstructorTest::validate_test_results( int ) +{ + int code = cvtest::TS::OK; + Point2f vertices[4]; + rec.points(vertices); + + int count_match = 0; + for( int i = 0; i < 4; i++ ) + { + if( norm(vertices[i] - a) <= 0.1 ) count_match++; + else if( norm(vertices[i] - b) <= 0.1 ) count_match++; + else if( norm(vertices[i] - c) <= 0.1 ) count_match++; + } + if( count_match == 3 ) + return code; + ts->printf( cvtest::TS::LOG, "RotatedRect end points don't match those supplied in constructor"); + ts->set_failed_test_info( cvtest::TS::FAIL_INVALID_OUTPUT ); + return code; +} + +TEST(Core_RotatedRect, three_point_constructor) { Core_RotatedRectConstructorTest test; test.safe_run(); }