diff --git a/modules/imgproc/src/intersection.cpp b/modules/imgproc/src/intersection.cpp index 84dbc8b8f1890a2d94eb4a33945904f25d9cff34..3f749896a42c8d2339ebae3cb6a1a20887fc89c6 100644 --- a/modules/imgproc/src/intersection.cpp +++ b/modules/imgproc/src/intersection.cpp @@ -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]; diff --git a/modules/imgproc/test/test_intersection.cpp b/modules/imgproc/test/test_intersection.cpp index 93909b3a9ee97f90180ce9b0e15bd3c83d654992..7527dd9a22cc2abd3404fe0a92be4f0596197f0f 100644 --- a/modules/imgproc/test/test_intersection.cpp +++ b/modules/imgproc/test/test_intersection.cpp @@ -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 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 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