zoukankan      html  css  js  c++  java
  • 试用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时结束,将取出的这个轮廓画出来,就可以了。

  • 相关阅读:
    线程安全的简单理解
    单链表 之 判断两链表是否交叉
    React组件间的通信
    input type=file美化
    Array.prototype.slice.call(arguments)
    ES5 数组方法every和some
    nodejs学习之表单提交(1)
    ES5 数组方法reduce
    ES5 数组方法map
    ES5 数组方法forEach
  • 原文地址:https://www.cnblogs.com/resound/p/1791031.html
Copyright © 2011-2022 走看看