imgproc: add rotatedRectangleIntersection empty input handling
authorAlexander Alekhin <alexander.a.alekhin@gmail.com>
Sun, 20 Dec 2020 02:05:46 +0000 (02:05 +0000)
committerAlexander Alekhin <alexander.a.alekhin@gmail.com>
Sun, 20 Dec 2020 02:06:50 +0000 (02:06 +0000)
modules/imgproc/src/intersection.cpp
modules/imgproc/test/test_intersection.cpp

index 84dbc8b8f1890a2d94eb4a33945904f25d9cff34..3f749896a42c8d2339ebae3cb6a1a20887fc89c6 100644 (file)
@@ -54,6 +54,12 @@ int rotatedRectangleIntersection( const RotatedRect& rect1, const RotatedRect& r
     // L2 metric
     const float samePointEps = std::max(1e-16f, 1e-6f * (float)std::max(rect1.size.area(), rect2.size.area()));
 
+    if (rect1.size.empty() || rect2.size.empty())
+    {
+        intersectingRegion.release();
+        return INTERSECT_NONE;
+    }
+
     Point2f vec1[4], vec2[4];
     Point2f pts1[4], pts2[4];
 
index 93909b3a9ee97f90180ce9b0e15bd3c83d654992..7527dd9a22cc2abd3404fe0a92be4f0596197f0f 100644 (file)
@@ -366,4 +366,29 @@ TEST(Imgproc_RotatedRectangleIntersection, regression_12221_2)
     EXPECT_LE(intersections.size(), (size_t)8);
 }
 
+TEST(Imgproc_RotatedRectangleIntersection, regression_18520)
+{
+    RotatedRect rr_empty(
+        Point2f(2, 2),
+        Size2f(0, 0),  // empty
+        0);
+    RotatedRect rr(
+        Point2f(50, 50),
+        Size2f(4, 4),
+        0);
+
+    {
+        std::vector<Point2f> intersections;
+        int interType = cv::rotatedRectangleIntersection(rr_empty, rr, intersections);
+        EXPECT_EQ(INTERSECT_NONE, interType) << "rr_empty, rr";
+        EXPECT_EQ((size_t)0, intersections.size()) << "rr_empty, rr";
+    }
+    {
+        std::vector<Point2f> intersections;
+        int interType = cv::rotatedRectangleIntersection(rr, rr_empty, intersections);
+        EXPECT_EQ(INTERSECT_NONE, interType) << "rr, rr_empty";
+        EXPECT_EQ((size_t)0, intersections.size()) << "rr, rr_empty";
+    }
+}
+
 }} // namespace