试用OpenCV中的轮廓

cvApproxPoly 用指定精度逼近多边形曲线

 

 

代码
  // 找到所有轮廓
  cvFindContours( dst, stor, &cont, sizeof(CvContour),
      CV_RETR_LIST, CV_CHAIN_APPROX_SIMPLE, cvPoint(0,0));
// 如果轮廓不为NULL,则用多边形来拟合找到的轮廓,以减少轮郭的"点数".
 
 
if(cont)
  {
// 绘制轮廓
  cvDrawContours(dsta,cont,CV_RGB(
255,255,0),CV_RGB(0,0,255),1,2,8,cvPoint(0,0));
mcont
=cvApproxPoly(cont,sizeof(CvContour),mstor,CV_POLY_APPROX_DP,cvContourPerimeter(cont)*0.02,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时结束,将取出的这个轮廓画出来,就可以了。

posted on 2010-08-03 11:35  resound  阅读(11318)  评论(0编辑  收藏  举报

导航