From bc3dd2452f41900f03348486b83c4d917c8f3964 Mon Sep 17 00:00:00 2001 From: Nghia Ho <nghiaho12@yahoo.com> Date: Wed, 31 Jul 2013 23:43:25 +1000 Subject: [PATCH] Added test cpp --- modules/imgproc/doc/pics/intersection.png | Bin 0 -> 32696 bytes modules/imgproc/test/test_intersection.cpp | 499 +++++++++++++++++++++ 2 files changed, 499 insertions(+) create mode 100644 modules/imgproc/doc/pics/intersection.png create mode 100644 modules/imgproc/test/test_intersection.cpp diff --git a/modules/imgproc/doc/pics/intersection.png b/modules/imgproc/doc/pics/intersection.png new file mode 100644 index 0000000000000000000000000000000000000000..4d1367c55e4dcebcd798d331b4a1ad9d97709694 GIT binary patch literal 32696 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 literal 0 HcmV?d00001 diff --git a/modules/imgproc/test/test_intersection.cpp b/modules/imgproc/test/test_intersection.cpp new file mode 100644 index 000000000..3a53d6f0c --- /dev/null +++ b/modules/imgproc/test/test_intersection.cpp @@ -0,0 +1,499 @@ +/*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. +// +// +// License Agreement +// For Open Source Computer Vision Library +// +// Copyright (C) 2000-2008, Intel Corporation, all rights reserved. +// Copyright (C) 2008-2011, Willow Garage Inc., all rights reserved. +// Third party copyrights are property of their respective owners. +// +// @Authors +// Nghia Ho, nghiaho12@yahoo.com +// +// 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 OpenCV Foundation 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 OpenCV Foundation 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; + +#define ACCURACY 0.00001 + +class CV_RotatedRectangleIntersectionTest: public cvtest::ArrayTest +{ +public: + +protected: + void run (int); + +private: + void test1(); + void test2(); + void test3(); + void test4(); + void test5(); + void test6(); + void test7(); + void test8(); + void test9(); +}; + +void CV_RotatedRectangleIntersectionTest::run(int) +{ + // See pics/intersection.png for the scenarios we are testing + + // Test the following scenarios: + // 1 - no intersection + // 2 - partial intersection, rectangle translated + // 3 - partial intersection, rectangle rotated 45 degree on the corner, forms a triangle intersection + // 4 - full intersection, rectangles of same size directly on top of each other + // 5 - partial intersection, rectangle on top rotated 45 degrees + // 6 - partial intersection, rectangle on top of different size + // 7 - full intersection, rectangle fully enclosed in the other + // 8 - partial intersection, rectangle corner just touching. point contact + // 9 - partial intersetion. rectangle side by side, line contact + + test1(); + test2(); + test3(); + test4(); + test5(); + test6(); + test7(); + test8(); + test9(); +} + +void CV_RotatedRectangleIntersectionTest::test1() +{ + // no intersection + + RotatedRect rect1, rect2; + + rect1.center.x = 0; + rect1.center.y = 0; + rect1.size.width = 2; + rect1.size.height = 2; + rect1.angle = 12.0f; + + rect2.center.x = 10; + rect2.center.y = 10; + rect2.size.width = 2; + rect2.size.height = 2; + rect2.angle = 34.0f; + + vector<Point2f> vertices; + + int ret = rotatedRectangleIntersection(rect1, rect2, vertices); + + CV_Assert(ret == INTERSECT_NONE); + CV_Assert(vertices.empty()); +} + +void CV_RotatedRectangleIntersectionTest::test2() +{ + // partial intersection, rectangles translated + + RotatedRect rect1, rect2; + + rect1.center.x = 0; + rect1.center.y = 0; + rect1.size.width = 2; + rect1.size.height = 2; + rect1.angle = 0; + + rect2.center.x = 1; + rect2.center.y = 1; + rect2.size.width = 2; + rect2.size.height = 2; + rect2.angle = 0; + + vector<Point2f> vertices; + + int ret = rotatedRectangleIntersection(rect1, rect2, vertices); + + CV_Assert(ret == INTERSECT_PARTIAL); + CV_Assert(vertices.size() == 4); + + vector<Point2f> possibleVertices(4); + + possibleVertices[0] = Point2f(0.0f, 0.0f); + possibleVertices[1] = Point2f(1.0f, 1.0f); + possibleVertices[2] = Point2f(0.0f, 1.0f); + possibleVertices[3] = Point2f(1.0f, 0.0f); + + for( size_t i = 0; i < vertices.size(); i++ ) + { + double bestR = DBL_MAX; + + for( size_t j = 0; j < possibleVertices.size(); j++ ) + { + double dx = vertices[i].x - possibleVertices[j].x; + double dy = vertices[i].y - possibleVertices[j].y; + double r = sqrt(dx*dx + dy*dy); + + bestR = std::min(bestR, r); + } + + CV_Assert(bestR < ACCURACY); + } +} + +void CV_RotatedRectangleIntersectionTest::test3() +{ + // partial intersection, rectangles rotated 45 degree on the corner, forms a triangle intersection + RotatedRect rect1, rect2; + + rect1.center.x = 0; + rect1.center.y = 0; + rect1.size.width = 2; + rect1.size.height = 2; + rect1.angle = 0; + + rect2.center.x = 1; + rect2.center.y = 1; + rect2.size.width = sqrt(2.0f); + rect2.size.height = 20; + rect2.angle = 45.0f; + + vector<Point2f> vertices; + + int ret = rotatedRectangleIntersection(rect1, rect2, vertices); + + CV_Assert(ret == INTERSECT_PARTIAL); + CV_Assert(vertices.size() == 3); + + vector<Point2f> possibleVertices(3); + + possibleVertices[0] = Point2f(1.0f, 1.0f); + possibleVertices[1] = Point2f(0.0f, 1.0f); + possibleVertices[2] = Point2f(1.0f, 0.0f); + + for( size_t i = 0; i < vertices.size(); i++ ) + { + double bestR = DBL_MAX; + + for( size_t j = 0; j < possibleVertices.size(); j++ ) + { + double dx = vertices[i].x - possibleVertices[j].x; + double dy = vertices[i].y - possibleVertices[j].y; + double r = sqrt(dx*dx + dy*dy); + + bestR = std::min(bestR, r); + } + + CV_Assert(bestR < ACCURACY); + } +} + +void CV_RotatedRectangleIntersectionTest::test4() +{ + // full intersection, rectangles of same size directly on top of each other + + RotatedRect rect1, rect2; + + rect1.center.x = 0; + rect1.center.y = 0; + rect1.size.width = 2; + rect1.size.height = 2; + rect1.angle = 0; + + rect2.center.x = 0; + rect2.center.y = 0; + rect2.size.width = 2; + rect2.size.height = 2; + rect2.angle = 0; + + vector<Point2f> vertices; + + int ret = rotatedRectangleIntersection(rect1, rect2, vertices); + + CV_Assert(ret == INTERSECT_FULL); + CV_Assert(vertices.size() == 4); + + vector<Point2f> possibleVertices(4); + + possibleVertices[0] = Point2f(-1.0f, 1.0f); + possibleVertices[1] = Point2f(1.0f, -1.0f); + possibleVertices[2] = Point2f(-1.0f, -1.0f); + possibleVertices[3] = Point2f(1.0f, 1.0f); + + for( size_t i = 0; i < vertices.size(); i++ ) + { + double bestR = DBL_MAX; + + for( size_t j = 0; j < possibleVertices.size(); j++ ) + { + double dx = vertices[i].x - possibleVertices[j].x; + double dy = vertices[i].y - possibleVertices[j].y; + double r = sqrt(dx*dx + dy*dy); + + bestR = std::min(bestR, r); + } + + CV_Assert(bestR < ACCURACY); + } +} + +void CV_RotatedRectangleIntersectionTest::test5() +{ + // partial intersection, rectangle on top rotated 45 degrees + + RotatedRect rect1, rect2; + + rect1.center.x = 0; + rect1.center.y = 0; + rect1.size.width = 2; + rect1.size.height = 2; + rect1.angle = 0; + + rect2.center.x = 0; + rect2.center.y = 0; + rect2.size.width = 2; + rect2.size.height = 2; + rect2.angle = 45.0f; + + vector<Point2f> vertices; + + int ret = rotatedRectangleIntersection(rect1, rect2, vertices); + + CV_Assert(ret == INTERSECT_PARTIAL); + CV_Assert(vertices.size() == 8); + + vector<Point2f> possibleVertices(8); + + possibleVertices[0] = Point2f(-1.0f, -0.414214f); + possibleVertices[1] = Point2f(-1.0f, 0.414214f); + possibleVertices[2] = Point2f(-0.414214f, -1.0f); + possibleVertices[3] = Point2f(0.414214f, -1.0f); + possibleVertices[4] = Point2f(1.0f, -0.414214f); + possibleVertices[5] = Point2f(1.0f, 0.414214f); + possibleVertices[6] = Point2f(0.414214f, 1.0f); + possibleVertices[7] = Point2f(-0.414214f, 1.0f); + + for( size_t i = 0; i < vertices.size(); i++ ) + { + double bestR = DBL_MAX; + + for( size_t j = 0; j < possibleVertices.size(); j++ ) + { + double dx = vertices[i].x - possibleVertices[j].x; + double dy = vertices[i].y - possibleVertices[j].y; + double r = sqrt(dx*dx + dy*dy); + + bestR = std::min(bestR, r); + } + + CV_Assert(bestR < ACCURACY); + } +} + +void CV_RotatedRectangleIntersectionTest::test6() +{ + // 6 - partial intersection, rectangle on top of different size + + RotatedRect rect1, rect2; + + rect1.center.x = 0; + rect1.center.y = 0; + rect1.size.width = 2; + rect1.size.height = 2; + rect1.angle = 0; + + rect2.center.x = 0; + rect2.center.y = 0; + rect2.size.width = 2; + rect2.size.height = 10; + rect2.angle = 0; + + vector<Point2f> vertices; + + int ret = rotatedRectangleIntersection(rect1, rect2, vertices); + + CV_Assert(ret == INTERSECT_PARTIAL); + CV_Assert(vertices.size() == 4); + + vector<Point2f> possibleVertices(4); + + possibleVertices[0] = Point2f(1.0f, 1.0f); + possibleVertices[1] = Point2f(1.0f, -1.0f); + possibleVertices[2] = Point2f(-1.0f, -1.0f); + possibleVertices[3] = Point2f(-1.0f, 1.0f); + + for( size_t i = 0; i < vertices.size(); i++ ) + { + double bestR = DBL_MAX; + + for( size_t j = 0; j < possibleVertices.size(); j++ ) + { + double dx = vertices[i].x - possibleVertices[j].x; + double dy = vertices[i].y - possibleVertices[j].y; + double r = sqrt(dx*dx + dy*dy); + + bestR = std::min(bestR, r); + } + + CV_Assert(bestR < ACCURACY); + } +} + +void CV_RotatedRectangleIntersectionTest::test7() +{ + // full intersection, rectangle fully enclosed in the other + + RotatedRect rect1, rect2; + + rect1.center.x = 0; + rect1.center.y = 0; + rect1.size.width = 12.34; + rect1.size.height = 56.78; + rect1.angle = 0; + + rect2.center.x = 0; + rect2.center.y = 0; + rect2.size.width = 2; + rect2.size.height = 2; + rect2.angle = 0; + + vector<Point2f> vertices; + + int ret = rotatedRectangleIntersection(rect1, rect2, vertices); + + CV_Assert(ret == INTERSECT_FULL); + CV_Assert(vertices.size() == 4); + + vector<Point2f> possibleVertices(4); + + possibleVertices[0] = Point2f(1.0f, 1.0f); + possibleVertices[1] = Point2f(1.0f, -1.0f); + possibleVertices[2] = Point2f(-1.0f, -1.0f); + possibleVertices[3] = Point2f(-1.0f, 1.0f); + + for( size_t i = 0; i < vertices.size(); i++ ) + { + double bestR = DBL_MAX; + + for( size_t j = 0; j < possibleVertices.size(); j++ ) + { + double dx = vertices[i].x - possibleVertices[j].x; + double dy = vertices[i].y - possibleVertices[j].y; + double r = sqrt(dx*dx + dy*dy); + + bestR = std::min(bestR, r); + } + + CV_Assert(bestR < ACCURACY); + } +} + +void CV_RotatedRectangleIntersectionTest::test8() +{ + // full intersection, rectangle fully enclosed in the other + + RotatedRect rect1, rect2; + + rect1.center.x = 0; + rect1.center.y = 0; + rect1.size.width = 2; + rect1.size.height = 2; + rect1.angle = 0; + + rect2.center.x = 2; + rect2.center.y = 2; + rect2.size.width = 2; + rect2.size.height = 2; + rect2.angle = 0; + + vector<Point2f> vertices; + + int ret = rotatedRectangleIntersection(rect1, rect2, vertices); + + CV_Assert(ret == INTERSECT_PARTIAL); + CV_Assert(vertices.size() == 1); + + double dx = vertices[0].x - 1; + double dy = vertices[0].y - 1; + double r = sqrt(dx*dx + dy*dy); + + CV_Assert(r < ACCURACY); +} + +void CV_RotatedRectangleIntersectionTest::test9() +{ + // full intersection, rectangle fully enclosed in the other + + RotatedRect rect1, rect2; + + rect1.center.x = 0; + rect1.center.y = 0; + rect1.size.width = 2; + rect1.size.height = 2; + rect1.angle = 0; + + rect2.center.x = 2; + rect2.center.y = 0; + rect2.size.width = 2; + rect2.size.height = 123.45; + rect2.angle = 0; + + vector<Point2f> vertices; + + int ret = rotatedRectangleIntersection(rect1, rect2, vertices); + + CV_Assert(ret == INTERSECT_PARTIAL); + CV_Assert(vertices.size() == 2); + + vector<Point2f> possibleVertices(2); + + possibleVertices[0] = Point2f(1.0f, 1.0f); + possibleVertices[1] = Point2f(1.0f, -1.0f); + + for( size_t i = 0; i < vertices.size(); i++ ) + { + double bestR = DBL_MAX; + + for( size_t j = 0; j < possibleVertices.size(); j++ ) + { + double dx = vertices[i].x - possibleVertices[j].x; + double dy = vertices[i].y - possibleVertices[j].y; + double r = sqrt(dx*dx + dy*dy); + + bestR = std::min(bestR, r); + } + + CV_Assert(bestR < ACCURACY); + } +} + +TEST (Imgproc_RotatedRectangleIntersection, accuracy) { CV_RotatedRectangleIntersectionTest test; test.safe_run(); }