Updates min_enclosing_triangle.cpp
authorSuleyman TURKMEN <sturkmen@hotmail.com>
Sun, 8 Oct 2017 10:22:13 +0000 (13:22 +0300)
committerSuleyman TURKMEN <sturkmen@hotmail.com>
Tue, 10 Oct 2017 20:23:36 +0000 (23:23 +0300)
modules/imgproc/include/opencv2/imgproc.hpp
modules/imgproc/src/min_enclosing_triangle.cpp
samples/cpp/minarea.cpp

index 076af52..7e47e2a 100644 (file)
@@ -3920,9 +3920,8 @@ CV_EXPORTS_W double contourArea( InputArray contour, bool oriented = false );
 /** @brief Finds a rotated rectangle of the minimum area enclosing the input 2D point set.
 
 The function calculates and returns the minimum-area bounding rectangle (possibly rotated) for a
-specified point set. See the OpenCV sample minarea.cpp . Developer should keep in mind that the
-returned rotatedRect can contain negative indices when data is close to the containing Mat element
-boundary.
+specified point set. Developer should keep in mind that the returned RotatedRect can contain negative
+indices when data is close to the containing Mat element boundary.
 
 @param points Input vector of 2D points, stored in std::vector\<\> or Mat
  */
@@ -3943,8 +3942,7 @@ CV_EXPORTS_W void boxPoints(RotatedRect box, OutputArray points);
 
 /** @brief Finds a circle of the minimum area enclosing a 2D point set.
 
-The function finds the minimal enclosing circle of a 2D point set using an iterative algorithm. See
-the OpenCV sample minarea.cpp .
+The function finds the minimal enclosing circle of a 2D point set using an iterative algorithm.
 
 @param points Input vector of 2D points, stored in std::vector\<\> or Mat
 @param center Output center of the circle.
@@ -3973,7 +3971,7 @@ than \f$\theta(n)\f$. Thus the overall complexity of the function is \f$O(n log(
 
 @param points Input vector of 2D points with depth CV_32S or CV_32F, stored in std::vector\<\> or Mat
 @param triangle Output vector of three 2D points defining the vertices of the triangle. The depth
-of the OutputArray must be CV_32F.
+of the OutputArray could be CV_32S or CV_32F.
  */
 CV_EXPORTS_W double minEnclosingTriangle( InputArray points, CV_OUT OutputArray triangle );
 
index ed4d5b9..702d148 100644 (file)
@@ -129,8 +129,6 @@ static bool areOnTheSameSideOfLine(const cv::Point2f &p1, const cv::Point2f &p2,
 
 static double areaOfTriangle(const cv::Point2f &a, const cv::Point2f &b, const cv::Point2f &c);
 
-static void copyResultingTriangle(const std::vector<cv::Point2f> &resultingTriangle, cv::OutputArray triangle);
-
 static void createConvexHull(cv::InputArray points, std::vector<cv::Point2f> &polygon);
 
 static double distanceBtwPoints(const cv::Point2f &a, const cv::Point2f &b);
@@ -324,7 +322,12 @@ static void findMinEnclosingTriangle(cv::InputArray points,
 
     createConvexHull(points, polygon);
     findMinEnclosingTriangle(polygon, resultingTriangle, area);
-    copyResultingTriangle(resultingTriangle, triangle);
+
+    if (triangle.depth() == CV_32S) {
+        cv::Mat(resultingTriangle).convertTo(triangle,CV_32S);
+    } else {
+        cv::Mat(resultingTriangle).copyTo(triangle);
+    }
 }
 
 //! Create the convex hull of the given set of points
@@ -364,16 +367,6 @@ static void findMinEnclosingTriangle(const std::vector<cv::Point2f> &polygon,
     }
 }
 
-//! Copy resultingTriangle to the OutputArray triangle
-/*!
-* @param resultingTriangle  Minimum area triangle enclosing the given polygon found by the algorithm
-* @param triangle           Minimum area triangle enclosing the given polygon returned to the user
-*/
-static void copyResultingTriangle(const std::vector<cv::Point2f> &resultingTriangle,
-                                  cv::OutputArray triangle) {
-    cv::Mat(resultingTriangle).copyTo(triangle);
-}
-
 //! Initialisation function
 /*!
 * @param triangle       Minimum area triangle enclosing the given polygon
index ac79db5..6f3c50f 100644 (file)
@@ -11,10 +11,7 @@ static void help()
     cout << "This program demonstrates finding the minimum enclosing box, triangle or circle of a set\n"
          << "of points using functions: minAreaRect() minEnclosingTriangle() minEnclosingCircle().\n"
          << "Random points are generated and then enclosed.\n\n"
-         << "Press ESC, 'q' or 'Q' to exit and any other key to regenerate the set of points.\n\n"
-         << "Call:\n"
-         << "./minarea\n"
-         << "Using OpenCV v" << CV_VERSION << "\n" << endl;
+         << "Press ESC, 'q' or 'Q' to exit and any other key to regenerate the set of points.\n\n";
 }
 
 int main( int /*argc*/, char** /*argv*/ )
@@ -40,18 +37,18 @@ int main( int /*argc*/, char** /*argv*/ )
         }
 
         // Find the minimum area enclosing bounding box
-        RotatedRect box = minAreaRect(Mat(points));
+        Point2f vtx[4];
+        RotatedRect box = minAreaRect(points);
+        box.points(vtx);
 
         // Find the minimum area enclosing triangle
-        vector<Point2f> triangle;
-
+        vector<Point> triangle;
         minEnclosingTriangle(points, triangle);
 
         // Find the minimum area enclosing circle
-        Point2f center, vtx[4];
+        Point2f center;
         float radius = 0;
-        minEnclosingCircle(Mat(points), center, radius);
-        box.points(vtx);
+        minEnclosingCircle(points, center, radius);
 
         img = Scalar::all(0);