CvContourPolygon *cvSimplifyPolygon(CvContourPolygon const *p, double const delta) { CV_FUNCNAME("cvSimplifyPolygon"); __CV_BEGIN__; { CV_ASSERT(p!=NULL); CV_ASSERT(p->size()>2); double furtherDistance=0.; unsigned int furtherIndex=0; CvContourPolygon::const_iterator it=p->begin(); ++it; for (unsigned int i=1; it!=p->end(); ++it, i++) { double d = cvDistancePointPoint(*it, p->front()); if (d>furtherDistance) { furtherDistance = d; furtherIndex = i; } } if (furtherDistance<delta) { CvContourPolygon *result = new CvContourPolygon; result->push_back(p->front()); return result; } bool *pnUseFlag = new bool[p->size()]; for (int i=1; i<p->size(); i++) pnUseFlag[i] = false; pnUseFlag[0] = pnUseFlag[furtherIndex] = true; simplifyPolygonRecursive(p, 0, furtherIndex, pnUseFlag, delta); simplifyPolygonRecursive(p, furtherIndex, -1, pnUseFlag, delta); CvContourPolygon *result = new CvContourPolygon; for (int i=0; i<p->size(); i++) if (pnUseFlag[i]) result->push_back((*p)[i]); delete[] pnUseFlag; return result; } __CV_END__; }
CvContourPolygon *cvConvertChainCodesToPolygon(CvContourChainCode const *cc) { CV_FUNCNAME("cvConvertChainCodesToPolygon"); __CV_BEGIN__; { CV_ASSERT(cc!=NULL); CvContourPolygon *contour = new CvContourPolygon; unsigned int x = cc->startingPoint.x; unsigned int y = cc->startingPoint.y; contour->push_back(cvPoint(x, y)); if (cc->chainCode.size()) { CvChainCodes::const_iterator it=cc->chainCode.begin(); CvChainCode lastCode = *it; x += cvChainCodeMoves[*it][0]; y += cvChainCodeMoves[*it][1]; ++it; for (; it!=cc->chainCode.end(); ++it) { if (lastCode!=*it) { contour->push_back(cvPoint(x, y)); lastCode=*it; } x += cvChainCodeMoves[*it][0]; y += cvChainCodeMoves[*it][1]; } } return contour; } __CV_END__; }