cvApproxPoly 用指定精度逼近多边形曲线
代码
// 找到所有轮廓
cvFindContours( dst, stor, &cont, sizeof(CvContour),
CV_RETR_LIST, CV_CHAIN_APPROX_SIMPLE, cvPoint(0,0));// 如果轮廓不为NULL,则用多边形来拟合找到的轮廓,以减少轮郭的"点数".
if(cont)}{// 绘制轮廓mcont=cvApproxPoly(cont,sizeof(CvContour),mstor,CV_POLY_APPROX_DP,cvContourPerimeter(cont)*0.02,0);
cvDrawContours(dsta,cont,CV_RGB(255,255,0),CV_RGB(0,0,255),1,2,8,cvPoint(0,0));
cvDrawContours(dsta,mcont,CV_RGB(255,0,0),CV_RGB(0,0,100),1,2,8,cvPoint(0,0));
cvFondcontours找到的轮廓有可能有NULL的时候(没找到的情况下),所以必须判断一下。
上面的代码运行时,如果找到的轮廓有两个或以上时,只有第一个被画出,怎么让它把所有的轮廓都画出来呢?
这时候就要使用迭代器了,代码如下:
1 // 遍历所有轮廓
2 {
3 // 迭代器
4 CvTreeNodeIterator iterator;
5 cvInitTreeNodeIterator(&iterator,cont,1);
6 while( 0 != (mcont = (CvSeq*)cvNextTreeNode(&iterator)))
7 {
8 mcont2=cvApproxPoly(mcont,sizeof(CvContour),mstor,CV_POLY_APPROX_DP,10/*cvContourPerimeter(cont)*0.02*/,0);
9 cvDrawContours(dsta,mcont2,CV_RGB(255,0,0),CV_RGB(0,0,100),1,2,8,cvPoint(0,0));
10 }
11 }
12
CvTreeNodeIterator定义一个迭代器,先用cvInitTreeNodeIterator函数代进去初始的轮廓,初始化一下。
再用一循环,每次取出一个轮廓,直到取回的是NULL时结束,将取出的这个轮廓画出来,就可以了。