added cv::convexityDefects (ticket #796)
authorVadim Pisarevsky <no@email>
Thu, 29 Mar 2012 19:42:47 +0000 (19:42 +0000)
committerVadim Pisarevsky <no@email>
Thu, 29 Mar 2012 19:42:47 +0000 (19:42 +0000)
modules/imgproc/include/opencv2/imgproc/imgproc.hpp
modules/imgproc/src/contours.cpp

index 8cbce70..1be5cbf 100644 (file)
@@ -1029,6 +1029,8 @@ CV_EXPORTS_W double matchShapes( InputArray contour1, InputArray contour2,
 //! computes convex hull for a set of 2D points.
 CV_EXPORTS_W void convexHull( InputArray points, OutputArray hull,
                               bool clockwise=false, bool returnPoints=true );
+//! computes the contour convexity defects
+CV_EXPORTS_W void convexityDefects( InputArray points, InputArray hull, OutputArray defects );
 
 //! returns true iff the contour is convex. Does not support contours with self-intersection
 CV_EXPORTS_W bool isContourConvex( InputArray contour );
index 507aa42..b9e4501 100644 (file)
@@ -1961,6 +1961,46 @@ void cv::convexHull( InputArray _points, OutputArray _hull, bool clockwise, bool
     shull.copyTo(dhull);
 }
 
+
+void cv::convexityDefects( InputArray _points, InputArray _hull, OutputArray _defects )
+{
+    Mat points = _points.getMat();
+    CV_Assert( points.isContinuous() && points.type() == CV_32SC2 );
+    Mat hull = _hull.getMat();
+    Ptr<CvMemStorage> storage = cvCreateMemStorage();
+    
+    CvMat c_points = points, c_hull = hull;
+    CvSeq* seq = cvConvexityDefects(&c_points, &c_hull);
+    int i, n = seq->total;
+    
+    if( n == 0 )
+    {
+        _defects.release();
+        return;
+    }
+    
+    _defects.create(n, 1, CV_32SC4);
+    Mat defects = _defects.getMat();
+    
+    SeqIterator<CvConvexityDefect> it = Seq<CvConvexityDefect>(seq).begin();
+    CvPoint* ptorg = (CvPoint*)points.data;
+    
+    for( i = 0; i < n; i++, ++it )
+    {
+        CvConvexityDefect& d = *it;
+        int idx0 = (int)(d.start - ptorg);
+        int idx1 = (int)(d.end - ptorg);
+        int idx2 = (int)(d.depth_point - ptorg);
+        CV_Assert( 0 <= idx0 && idx0 < n );
+        CV_Assert( 0 <= idx1 && idx1 < n );
+        CV_Assert( 0 <= idx2 && idx2 < n );
+        CV_Assert( d.depth >= 0 );
+        int idepth = cvRound(d.depth*256);
+        defects.at<Vec4i>(i) = Vec4i(idx0, idx1, idx2, idepth);
+    }
+}
+
+
 bool cv::isContourConvex( InputArray _contour )
 {
     Mat contour = _contour.getMat();
@@ -1992,7 +2032,6 @@ void cv::fitLine( InputArray _points, OutputArray _line, int distType,
     CvMat _cpoints = points.reshape(2 + is3d);
     float line[6];
     cvFitLine(&_cpoints, distType, param, reps, aeps, &line[0]);
-
     
     int out_size = (is2d)?( (is3d)? (points.channels() * points.rows * 2) : 4 ): 6;