爱乐眼底图像分析

 找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 15451|回复: 2

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

[复制链接]
发表于 2012-6-3 16:55:52 | 显示全部楼层 |阅读模式

// 找到所有轮廓
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));
}

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
回复

使用道具 举报

 楼主| 发表于 2012-6-3 16:57:08 | 显示全部楼层

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时结束,将取出的这个轮廓画出来,就可以了。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



QQ|Archiver|手机版|小黑屋|爱乐眼底图像分析 ( 京ICP备1201155号 )        

GMT+8, 2024-11-21 21:12 , Processed in 0.049996 second(s), 19 queries .

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表