From e36ad508253fbe26b58221b95188a57fc73923ac Mon Sep 17 00:00:00 2001 From: Vadim Pisarevsky Date: Thu, 29 Mar 2012 19:42:47 +0000 Subject: [PATCH] added cv::convexityDefects (ticket #796) --- .../imgproc/include/opencv2/imgproc/imgproc.hpp | 2 ++ modules/imgproc/src/contours.cpp | 41 +++++++++++++++++++++- 2 files changed, 42 insertions(+), 1 deletion(-) diff --git a/modules/imgproc/include/opencv2/imgproc/imgproc.hpp b/modules/imgproc/include/opencv2/imgproc/imgproc.hpp index 8cbce70..1be5cbf 100644 --- a/modules/imgproc/include/opencv2/imgproc/imgproc.hpp +++ b/modules/imgproc/include/opencv2/imgproc/imgproc.hpp @@ -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 ); diff --git a/modules/imgproc/src/contours.cpp b/modules/imgproc/src/contours.cpp index 507aa42..b9e4501 100644 --- a/modules/imgproc/src/contours.cpp +++ b/modules/imgproc/src/contours.cpp @@ -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 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 it = Seq(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(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; -- 2.7.4