From 868787c3641a69a6724a674efb8426082d103274 Mon Sep 17 00:00:00 2001 From: n0099 Date: Wed, 3 May 2023 19:15:53 +0800 Subject: [PATCH] Merge pull request #23342 from n0099:#23335 Improve document of cv::RotatedRect for #23335 #23342 fix #23335 ### Pull Request Readiness Checklist See details at https://github.com/opencv/opencv/wiki/How_to_contribute#making-a-good-pull-request - [x] I agree to contribute to the project under Apache 2 License. - [x] To the best of my knowledge, the proposed patch is not based on a code under GPL or another license that is incompatible with OpenCV - [x] The PR is proposed to the proper branch - [x] There is a reference to the original bug report and related work - [x] There is accuracy test, performance test and test data in opencv_extra repository, if applicable Patch to opencv_extra has the same branch name. - [x] The feature is well documented and sample code can be built with the project CMake --- modules/core/doc/pics/rotatedrect.png | Bin 4590 -> 1831 bytes modules/core/include/opencv2/core/types.hpp | 7 +++++-- .../tutorial_code/snippets/core_various.cpp | 5 +++++ 3 files changed, 10 insertions(+), 2 deletions(-) diff --git a/modules/core/doc/pics/rotatedrect.png b/modules/core/doc/pics/rotatedrect.png index 344bf49ad0dc0e0f694e85dc28be9b049ab25801..8c43e32b86648daec05bdfd0468699055142cd6b 100644 GIT binary patch literal 1831 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 diff --git a/modules/core/include/opencv2/core/types.hpp b/modules/core/include/opencv2/core/types.hpp index 9da1450d46..73cb29f73a 100644 --- a/modules/core/include/opencv2/core/types.hpp +++ b/modules/core/include/opencv2/core/types.hpp @@ -545,8 +545,11 @@ public: */ RotatedRect(const Point2f& point1, const Point2f& point2, const Point2f& point3); - /** returns 4 vertices of the rectangle - @param pts The points array for storing rectangle vertices. The order is bottomLeft, topLeft, topRight, bottomRight. + /** returns 4 vertices of the rotated rectangle + @param pts The points array for storing rectangle vertices. The order is _bottomLeft_, _topLeft_, topRight, bottomRight. + @note _Bottom_, _Top_, _Left_ and _Right_ sides refer to the original rectangle (angle is 0), + so after 180 degree rotation _bottomLeft_ point will be located at the top right corner of the + rectangle. */ void points(Point2f pts[]) const; //! returns the minimal up-right integer rectangle containing the rotated rectangle diff --git a/samples/cpp/tutorial_code/snippets/core_various.cpp b/samples/cpp/tutorial_code/snippets/core_various.cpp index 4639940856..2be97f989d 100644 --- a/samples/cpp/tutorial_code/snippets/core_various.cpp +++ b/samples/cpp/tutorial_code/snippets/core_various.cpp @@ -38,6 +38,8 @@ int main() waitKey(0); //! [Algorithm] + const char * vertex_names[4] {"0", "1", "2", "3"}; + //! [RotatedRect_demo] Mat test_image(200, 200, CV_8UC3, Scalar(0)); RotatedRect rRect = RotatedRect(Point2f(100,100), Size2f(100,50), 30); @@ -45,7 +47,10 @@ int main() Point2f vertices[4]; rRect.points(vertices); for (int i = 0; i < 4; i++) + { line(test_image, vertices[i], vertices[(i+1)%4], Scalar(0,255,0), 2); + putText(test_image, vertex_names[i], vertices[i], FONT_HERSHEY_SIMPLEX, 1, Scalar(255,255,255)); + } Rect brect = rRect.boundingRect(); rectangle(test_image, brect, Scalar(255,0,0), 2);