CvMemStorage* storage = cvCreateMemStorage(0);
CvSeq* contour = 0;
//传入图像必须是8位单通道,将被修改
int iCount=cvFindContours( imgDst, storage, &contour, sizeof(CvContour), CV_RETR_CCOMP, CV_CHAIN_CODE );
//检索模式,可取值如下:
//CV_RETR_EXTERNAL:只检索最外面的轮廓;
//CV_RETR_LIST:检索所有的轮廓,并将其放入list中;
//CV_RETR_CCOMP:检索所有的轮廓,并将他们组织为两层:顶层是各部分的外部边界,第二层是空洞的边界;
//CV_RETR_TREE:检索所有的轮廓,并重构嵌套轮廓的整个层次。
//边缘近似方法(除了CV_RETR_RUNS使用内置的近似,其他模式均使用此设定的近似算法)。可取值如下:
//CV_CHAIN_CODE:以Freeman链码的方式输出轮廓,所有其他方法输出多边形(顶点的序列)。
//CV_CHAIN_APPROX_NONE:将所有的连码点,转换成点。
//CV_CHAIN_APPROX_SIMPLE:压缩水平的、垂直的和斜的部分,也就是,函数只保留他们的终点部分。
//CV_CHAIN_APPROX_TC89_L1,CV_CHAIN_APPROX_TC89_KCOS:使用the flavors of Teh-Chin chain近似算法的一种。
//CV_LINK_RUNS:通过连接水平段的1,使用完全不同的边缘提取算法。使用CV_RETR_LIST检索模式能使用此方法。

rectVec->clear();
for( ; contour != 0; contour = contour->h_next )
{
//if(fabs(area) < 100)
//{
// continue;
//}

//得到外部轮廓
if (iMode==1 || iMode==3)
{
CvRect rect=((CvContour*)contour)->rect;
CRect rectTemp(rect.x,rect.y,rect.x+rect.width,rect.y+rect.height);
if (bHasROI)
{
rectTemp.OffsetRect(iROIx1,iROIy1);
}
rectVec->push_back(rectTemp);

if (contoursPtVec!=NULL)
{
//ContoursPoint cPt;
vector<CPoint> *ptVec=new vector<CPoint>;
CString str,strstr;
strstr.Empty();
for (int i=0; i<contour->total; i++)
{
CvPoint* p = CV_GET_SEQ_ELEM(CvPoint,contour,i);
ptVec->push_back(CPoint(p->x,p->y));

str.Format(_T("%d\t%d %d\n"),i+1,p->x,p->y);
strstr+=str;
}
AfxMessageBox(strstr);

contoursPtVec->push_back(ptVec);
}

if (1==1)//返回freemain链码 设置cvFindContours参数=CV_CHAIN_CODE
{
  CvSeqReader reader;
  int i, total = contour->total;
  cvStartReadSeq( (CvSeq*)contour, &reader, 0 );
CvChainPtReader reader1;
cvStartReadChainPoints((CvChain*)contour, &reader1);
CString str,strstr;
  for( i = 0; i < total; i++ )
  {
  char code;
  CV_READ_SEQ_ELEM( code, reader ); 
CvPoint pt;
CV_READ_CHAIN_POINT(pt,reader1);
  //printf(" %d : \n",code);//得到轮廓的Freeman链码序列

str.Format(_T("%d %d\t%d\t%d %d\n"),total,i+1,code,reader1.pt.x,reader1.pt.y);
//AfxMessageBox(_T("check"));
  strstr+=str;
  }
  AfxMessageBox(strstr);
}

// //得到轮廓面积,长度
// double area = cvContourArea( contour,CV_WHOLE_SEQ );
// double length=cvArcLength(contour,CV_WHOLE_SEQ );
// CString str;
// str.Format(_T("外%.2f %.2f (%d %d %d %d)"),fabs(area),length,rectTemp.left,rectTemp.top,rectTemp.right,rectTemp.bottom);
// AfxMessageBox(str);
}

if (iMode==2 || iMode==3)
{
//CV_RETR_CCOMP 时得到孔洞
CvSeq* contourVNext = contour->v_next;
for (; contourVNext!=0; contourVNext=contourVNext->h_next)
{
CvRect rect=((CvContour*)contourVNext)->rect;
CRect rectTemp(rect.x,rect.y,rect.x+rect.width,rect.y+rect.height);
rectTemp.InflateRect(-1,-1);
if (bHasROI)
{
rectTemp.OffsetRect(iROIx1,iROIy1);
}
rectVec->push_back(rectTemp);

// //得到轮廓面积,长度
// double area = cvContourArea( contourVNext,CV_WHOLE_SEQ );
// double length=cvArcLength(contourVNext,CV_WHOLE_SEQ );
// CString str;
// str.Format(_T("内%.2f %.2f (%d %d %d %d)"),fabs(area),length,rectTemp.left,rectTemp.top,rectTemp.right,rectTemp.bottom);
// AfxMessageBox(str);

}
}

}

opencv cvFindContour 轮廓 freeman链码相关推荐

  1. OpenCV的轮廓查找和填充

    OpenCV的轮廓查找有C版本和C++版本,当轮廓比较复杂的时候,例如嵌入多层轮廓,如果方法不当那么很容易会漏处理一些轮廓.本文介绍了复杂轮廓场景下的几种主要的查找轮廓和颜色填充方法. 1:cvFin ...

  2. 使用Opencv进行轮廓检测,字符提取,简单的直方图字符识别!

    一.使用Opencv进行轮廓检测! 所需函数: 1. cvFindContours 函数功能:从二值图像中检索轮廓,并返回检测到的轮廓的个数 函数原型: int)  cvFindContours( C ...

  3. Freeman链码(弗雷曼链码)--matlab实现

    Freeman链码(弗雷曼链码)–matlab实现 clear; clc;close all; % 下面是对单幅图像处理的程序 I=imread('../images/8.jpg'); % I为一幅包 ...

  4. freeman 链码

    文章转自:http://blog.sina.com.cn/s/blog_6f57a7150100opue.html 假设简单图像: f =      1     1     0     1     1 ...

  5. freeman链码,归一化链码,一阶差分链码,归一化一阶差分链码

    最近在做一些关于图像的东西,在用边界跟踪提取图像的边界之后要用链码编码之后才能进行下一步处理,所以查资料学习了一下标题里面提到的东西.在这里就不说这些东西的背景了,主要是通俗地解释一下这些东西的原理. ...

  6. 使用Python和OpenCV对轮廓进行排序(从左到右,自上而下)

    使用Python和OpenCV对轮廓进行排序(从左到右,自上而下) 1. 效果图 2. 原理 3. 源码 参考 使用轮廓来构建移动文档扫描仪. 使用轮廓来检测图像中的条形码. 利用轮廓来找到从相机到物 ...

  7. Python,OpenCV应用轮廓逼近算法,检测对象的形状

    上一篇博客,我们学习了如何利用Python.OpenCV计算轮廓的中心,这一节学习仅运用轮廓的基本属性来检测其形状,三角形,正方形,矩形,五边形,圆. (1)利用轮廓逼近,将曲线上的点数减少为更简单的 ...

  8. 使用Python、OpenCV计算轮廓的中心

    1. 使用Python.OpenCV计算轮廓的中心并标记 2. 使用Python.OpenCV检测轮廓的形状并标记 3. 使用颜色通道统计信息来标记形状的实际颜色并标记 本博客的目标:(1)检测图像中 ...

  9. 如何利用OpenCV寻找轮廓的中心?

    简 介: 本文介绍了利用OpenCV和Python编程来计算形状轮廓的中心点.当然后面还会继续给出如何通过轮廓来分辨物体形状种类,以及对于各自的颜色进行标准. 关键词: OpenCV,contours ...

最新文章

  1. 2022-2028年中国硅胶手套产业竞争现状及发展趋势分析报告
  2. Java学习笔记(5)——泛型
  3. 如何使用有序GUID提升数据库读写性能
  4. 2018 上海.NET职位围观报告
  5. Android Sdk 国内镜像下载地址
  6. cadence快捷键修改文件_PCB快捷键设置
  7. [LeetCode] 118. Pascal's Triangle Java
  8. [转]为什么python标准库没有实现链表
  9. Cannot load JDBC driver class 'com.mysql.jdbc.Driver '
  10. Rad Controls_Q2_2006 注册机
  11. 分布式存储系统学习笔记(三)—分布式键值系统(1)—Amazon Dynamo
  12. MongoDB学习(黑马教程)-2-数据库MongoDB的导入文档和查询文档的操作
  13. 有用facs做计算机表情识别的嘛,人脸表情识别可以测谎吗
  14. 华为android解锁,华为手机如何解锁 华为手机解锁方法【图文详解】
  15. 999999999分解质因数
  16. 扫雷小游戏(可选择简单、一般、困难三种模式、可展开,可标记)
  17. 科技新品 | 索尼全画幅电影摄影机FX6;数字健康管理专业品牌Zepp智能手表;彩色视频电子纸显示器取得重大突破...
  18. 汉字转拼音(完全模式)
  19. HTML视频学习教程,让你实战入门前端
  20. mtd分区创建linux,浅析linux下mtd设备onenand存储器的分区和节点创建流程及yaffs2文件系统挂载...

热门文章

  1. python 下的 word2vec 学习笔记
  2. 漫画行业有妖气:曾经的一哥,今日的难兄
  3. pytorch小知识点(二)-------CrossEntropyLoss(reduction参数)
  4. 收楼了心情忐忑不安,该花钱请验房师来验房吗?找一个验房师需要多少钱,验房标准价格是多少,验房师现场验收出二百多个问题值不值
  5. java mysql 生僻字_mysql/Java服务端对emoji或者生僻字的支持
  6. linux--shell基础
  7. Java实现搜索在Bait游戏中的应用研究
  8. openGauss Summit 2021 | 汇聚数据库创新力量 逐梦数字时代星辰大海
  9. 我每天都要打开的8个在线网站,很有用~
  10. Java开发专家阿里P6-P7面试题大全及答案汇总(持续更新)