diff --git a/modules/core/include/opencv2/core/types.hpp b/modules/core/include/opencv2/core/types.hpp index 2a1070303..0b09c6fb0 100644 --- a/modules/core/include/opencv2/core/types.hpp +++ b/modules/core/include/opencv2/core/types.hpp @@ -392,7 +392,7 @@ public: //! various constructors RotatedRect(); RotatedRect(const Point2f& center, const Size2f& size, float angle); - RotatedRect(const std::vector& points); + RotatedRect(const Point2f& point1, const Point2f& point2, const Point2f& point3); //! returns 4 vertices of the rectangle void points(Point2f pts[]) const; @@ -1548,31 +1548,6 @@ inline RotatedRect::RotatedRect(const Point2f& _center, const Size2f& _size, float _angle) : center(_center), size(_size), angle(_angle) {} -inline -RotatedRect::RotatedRect(const std::vector& _points) -{ - CV_Assert( _points.size() == 3 ); - Point2f _center = 0.5f * (_points[0] + _points[2]); - Vec2f vecs[2]; - vecs[0] = Vec2f(_points[0] - _points[1]); - vecs[1] = Vec2f(_points[1] - _points[2]); - // check that given sides are perpendicular - CV_Assert( abs(vecs[0].dot(vecs[1])) <= 0.001 ); - - // 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 - int wd_i = 0; - if( vecs[1][0] != 0 && fabs(vecs[1][1] / vecs[1][0]) <= 1.0f ) wd_i = 1; - int ht_i = (wd_i + 1) % 2; - - float _angle = atan(vecs[wd_i][1] / vecs[wd_i][0]) * 180.0f / (float) CV_PI; - float _width = (float) norm(vecs[wd_i]); - float _height = (float) norm(vecs[ht_i]); - - center = _center; - size = Size2f(_width, _height); - angle = _angle; -} ///////////////////////////////// Range ///////////////////////////////// diff --git a/modules/core/src/matrix.cpp b/modules/core/src/matrix.cpp index e89799973..02ca1c969 100644 --- a/modules/core/src/matrix.cpp +++ b/modules/core/src/matrix.cpp @@ -5204,6 +5204,30 @@ void normalize( const SparseMat& src, SparseMat& dst, double a, int norm_type ) ////////////////////// RotatedRect ////////////////////// +RotatedRect::RotatedRect(const Point2f& _point1, const Point2f& _point2, const Point2f& _point3) +{ + Point2f _center = 0.5f * (_point1 + _point3); + Vec2f vecs[2]; + 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 ); + + // 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 + int wd_i = 0; + if( vecs[1][0] != 0 && abs(vecs[1][1] / vecs[1][0]) <= 1.0f ) wd_i = 1; + int ht_i = (wd_i + 1) % 2; + + float _angle = atan(vecs[wd_i][1] / vecs[wd_i][0]) * 180.0f / (float) CV_PI; + float _width = (float) norm(vecs[wd_i]); + float _height = (float) norm(vecs[ht_i]); + + center = _center; + size = Size2f(_width, _height); + angle = _angle; +} + void RotatedRect::points(Point2f pt[]) const { double _angle = angle*CV_PI/180.;