最后,我在我的程序中实现了 poly2tri 库。
这是结果(OpenCV 获取轮廓,然后 poly2tri 执行三角剖分):
// -------------------- poly2tri --------------------
NSMutableArray* temp = [[NSMutableArray alloc] init];
vector<p2t::Triangle*> triangles;
vector< vector<p2t::Point*> > polylines;
vector<p2t::Point*> polyline;
for(int i = 0; i < contour32->total; i++ ) {
CvPoint2D32f* pt32 = CV_GET_SEQ_ELEM(CvPoint2D32f, contour32, i);
polyline.push_back(new p2t::Point((double)pt32->x, (double)pt32->y));
}
polylines.push_back(polyline);
p2t::CDT* cdt = new p2t::CDT(polyline);
// TODO -> holes with CV_RETR_TREE
// Triangulation !
cdt->Triangulate();
// On exporte nos triangles
triangles = cdt->GetTriangles();
for (int i = 0; i < triangles.size(); i++) {
p2t::Triangle& t = *triangles[i];
p2t::Point& a = *t.GetPoint(0);
p2t::Point& b = *t.GetPoint(1);
p2t::Point& c = *t.GetPoint(2);
double x1 = (width / rWidth * (double)a.x) - (width / 2.f);
double y1 = (height / rHeight * (double)a.y) - (height / 2.f);
double x2 = (width / rWidth * (double)b.x) - (width / 2.f);
double y2 = (height / rHeight * (double)b.y) - (height / 2.f);
double x3 = (width / rWidth * (double)c.x) - (width / 2.f);
double y3 = (height / rHeight * (double)c.y) - (height / 2.f);
[temp addObject:[[NSArray arrayWithObjects:
[NSArray arrayWithObjects:
[NSNumber numberWithDouble:x1],
[NSNumber numberWithDouble:y1],
[NSNumber numberWithDouble:0.],
nil],
[NSArray arrayWithObjects:
[NSNumber numberWithDouble:x2],
[NSNumber numberWithDouble:y2],
[NSNumber numberWithDouble:0.],
nil],
[NSArray arrayWithObjects:
[NSNumber numberWithDouble:x3],
[NSNumber numberWithDouble:y3],
[NSNumber numberWithDouble:0.],
nil],
nil] autorelease]];
}
[outDelaunay addObject:temp];
其中contour32 是使用cvFindContours 找到的OpenCV 轮廓,然后转换为float32。