added cv::convexityDefects (ticket #796)

This commit is contained in:
Vadim Pisarevsky 2012-03-29 19:42:47 +00:00
parent 959c37fccf
commit e36ad50825
2 changed files with 42 additions and 1 deletions

View 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 );

View 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;