added cv::convexityDefects (ticket #796)
This commit is contained in:
parent
959c37fccf
commit
e36ad50825
@ -1029,6 +1029,8 @@ CV_EXPORTS_W double matchShapes( InputArray contour1, InputArray contour2,
|
|||||||
//! computes convex hull for a set of 2D points.
|
//! computes convex hull for a set of 2D points.
|
||||||
CV_EXPORTS_W void convexHull( InputArray points, OutputArray hull,
|
CV_EXPORTS_W void convexHull( InputArray points, OutputArray hull,
|
||||||
bool clockwise=false, bool returnPoints=true );
|
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
|
//! returns true iff the contour is convex. Does not support contours with self-intersection
|
||||||
CV_EXPORTS_W bool isContourConvex( InputArray contour );
|
CV_EXPORTS_W bool isContourConvex( InputArray contour );
|
||||||
|
@ -1961,6 +1961,46 @@ void cv::convexHull( InputArray _points, OutputArray _hull, bool clockwise, bool
|
|||||||
shull.copyTo(dhull);
|
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 )
|
bool cv::isContourConvex( InputArray _contour )
|
||||||
{
|
{
|
||||||
Mat contour = _contour.getMat();
|
Mat contour = _contour.getMat();
|
||||||
@ -1992,7 +2032,6 @@ void cv::fitLine( InputArray _points, OutputArray _line, int distType,
|
|||||||
CvMat _cpoints = points.reshape(2 + is3d);
|
CvMat _cpoints = points.reshape(2 + is3d);
|
||||||
float line[6];
|
float line[6];
|
||||||
cvFitLine(&_cpoints, distType, param, reps, aeps, &line[0]);
|
cvFitLine(&_cpoints, distType, param, reps, aeps, &line[0]);
|
||||||
|
|
||||||
|
|
||||||
int out_size = (is2d)?( (is3d)? (points.channels() * points.rows * 2) : 4 ): 6;
|
int out_size = (is2d)?( (is3d)? (points.channels() * points.rows * 2) : 4 ): 6;
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user