最近自己要研究一个约束三角剖分的细分功能(对一个服装进行三角剖分、细分并且变形),搜了很久,找到一个比较对口的库——CGAL库。但是国内使用的人很少,资料也很少。所以自己还是处于最基本的摸索阶段。虽然自己也是属于一桶水连一瓢都木有的状态(跟不用说半桶水了orz...),不过还是经过反复试验,实现了自己所需要的功能(中间有一些小问题还尚未解决,写出来希望大牛们一起探讨这么可以解决)。
问题:如下图,提取服装的轮廓之后,对其进行约束三角剖分(轮廓作为约束边)并且细分。
提取的服装轮廓(用关键点的连线多边形表示)如下图:
将以上由关键点组成的polygon作为边界约束,进行三角剖分以及细化。为了方便,首先加入一些头文件并且定义一些CGAL数据(其实我也不是很懂这些参数的意义,反正看到CGAL用户手册上总是定义一堆数据,下面的这些定义都是差不多,我直接copy过来的。你们也照着抄吧,哈哈哈)。原版CGAL实例中定义CDT::Point Point,但是因为我的应用中还用到openCV,里面也有一个cv::Point,为了防止冲突我就改成了typedef CDT::Point CdtPoint.
然后对以上的这些关键点组成的封闭多边形进行约束三角剖分(CDT: Constrained Delaunay Triangulation),所以先在主函数定义一个CDT cdt; 然后将这些点将入CDT中,并且每对相邻点是一个边约束。
主要用到的函数:
<span style="font-size:14px;">Vertex_handle insert(const Point& p, Face_handle start = Face_handle());
Constrained_triangulation_2<Gt,Tds,Itag>::insert_constraint(Vertex_handle vaa, Vertex_handle vbb);</span>
我直接写了一个InsertPolygon()的函数:
<span style="font-size:14px;">void InsertPolygonInCDT(CDT& cdt, vector<CdtPoint> polygon)
{
int s = polygon.size();
for (int i=0; i<s; i++)
{
Vertex_handle v_pt = cdt.insert(polygon[i]);
Vertex_handle v_pt2 = cdt.insert(polygon[(i+1)%s]);//依次插入两个相邻的关键点
cdt.insert_constraint(v_pt, v_pt2);//将相邻点作为一个边约束插入CDT
}
}</span>
接着,对cdt进行细分,用到的函数为:
<span style="font-size:14px;">CGAL::refine_Delaunay_mesh_2(CDT cdt, Criteria(0.125, min_len));</span>
其中Criteria指示的是细分度,第一个参数默认为0.125(具体含义看手册好像是和B有关的细分参数,其余我也不是很清楚,索性都直接写0.125好了),第二个参数表示细分中最大的边长长度