void cv::approxPolyDP
(
InputArray curve,
OutputArray approxCurve,
double epsilon,
bool closed
)
功能:该函数是以指定的精度逼近一条多边形曲线
说明:该函数是用一条具有较少顶点的曲线/多边形去逼近另一条具有较多顶点的曲线或多边形,并且它们之间的距离小于等于指定的精度,其中算法采用Douglas-Peucker algorithm。
参数:
curve:存储在std::vector或Mat中的2D曲线点集
approxCurve:逼近的曲线,其类型需要与输入曲线的类型匹配
epsilon:用于指定逼近精度的参数,为原始曲线与逼近曲线的最大距离
closed:曲线是否闭合的开关(若为真,则逼近曲线为闭合曲线)
注:
- 道格拉斯-普克算法(Douglas–Peucker algorithm,亦称为拉默-道格拉斯-普克算法、迭代适应点算法、分裂与合并算法)是将曲线近似表示为一系列点,并减少点的数量的一种算法。该算法的原始类型分别由乌尔斯·拉默(Urs Ramer)于1972年以及大卫·道格拉斯(David Douglas)和托马斯·普克(Thomas Peucker)于1973年提出,并在之后的数十年中由其他学者予以完善。
- Douglas-Peucker算法描述如下:
(1)在曲线首尾两点A、B之间连接一条直线AB,该直线为曲线的弦;
(2)得到曲线上离该直线段距离最大的点C,计算其与AB的距离d;
(3)比较该距离与预先给定的阈值threshold的大小,如果小于threshold,则该直线段作为曲线的近似,该段曲线处理完毕;
(4)如果距离大于阈值,则用C将曲线分为两段AC和BC,并分别对两段曲线进行1~3的处理;
(5)当所有曲线都处理完毕时,依次连接各个分割点形成的折线,即可以作为曲线的近似。