//! 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 );
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();
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;