cvFindContours函数
cvFindContours函数:
int cvFindContours( CvArr* image, CvMemStorage* storage, CvSeq** first_contour,
int header_size=sizeof(CvContour), int mode=CV_RETR_LIST,
int method=CV_CHAIN_APPROX_SIMPLE, CvPoint offset=cvPoint(0,0) );
image:
8比特单通道的源二值图像。非零像素作为1处理,0像素保存不变。从一个灰度图像得到二值图像的函数有:cvThreshold,cvAdaptiveThreshold和cvCanny。
storage:返回轮廓的容器。
first_contour:
输出参数,用于存储指向第一个外接轮廓。
header_size:
header序列的尺寸.如果选择method = CV_CHAIN_CODE, 则header_size >= sizeof(CvChain);其他,则 header_size >= sizeof(CvContour)。
mode:
CV_RETR_EXTERNAL:只检索最外面的轮廓;
CV_RETR_LIST:检索所有的轮廓,并将其放入list中;
CV_RETR_CCOMP:检索所有的轮廓,并将他们组织为两层:顶层是各部分的外部边界,第二层是空洞的边界;
CV_RETR_TREE:检索所有的轮廓,并重构嵌套轮廓的整个层次。
蓝色表示v_next,绿色表示h_next
method:
边缘近似方法(除了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检索模式能使用此方法。
offset:
偏移量,用于移动所有轮廓点。当轮廓是从图像的ROI提取的,并且需要在整个图像中分析时,这个参数将很有用。
我的一个不知道从哪里抄来的栗子:
#include "stdafx.h"
#include "cv.h"
#include "highgui.h"
#define CVX_RED CV_RGB(0xff, 0x00, 0x00)
#define CVX_GREEN CV_RGB(0x00, 0xff, 0x00)
#define CVX_BLUE CV_RGB(0x00, 0x00, 0xff)
using namespace cv;
int main()
{
IplImage* img_8uc1 = NULL;
cvNamedWindow("img_contour", CV_WINDOW_AUTOSIZE);
if (img_8uc1 = cvLoadImage("cv38.jpg", 0))
{
IplImage* img_edge = cvCreateImage(cvGetSize(img_8uc1), 8, 1);
IplImage* img_8uc3 = cvCreateImage(cvGetSize(img_8uc1), 8, 3);
cvThreshold(img_8uc1, img_edge, 128, 255, CV_THRESH_BINARY);
//对灰度图img_8uc1 像进行阈值操作得到二值图像 img_edge
CvMemStorage* storage = cvCreateMemStorage();
//创建一个内存储存器 默认为 64K
CvSeq* first_contour = NULL;
//创建一个动态序列指针,用其指向第一个存储轮廓单元地址
int NC = cvFindContours(
//cvFindContours从二值图像中检索轮廓,并返回检测到的轮廓的个数
img_edge,
storage, //存储轮廓元素的储存容器
&first_contour, //指向第一个输出轮廓
sizeof (CvContour),
CV_RETR_LIST //提取所有轮廓,并且放置在 list 中
);
printf("Total Contours Detected: %d\n", NC);
cvCvtColor(img_8uc1, img_8uc3, CV_GRAY2BGR);
//色彩空间转换,将img_8uc1 转换为BGR空间,img_8uc3 为转换后结果
int n = 0;
//用于下面轮廓的记数
for (CvSeq* c=first_contour; c!=NULL; c = c->h_next)
{ //从第一个轮廓开始遍历,直到所有轮廓都遍历结束
CvRect rect = cvBoundingRect(c,1);
if (rect.height > 0 && rect.width > 0 )
{
if ( (double)rect.height / (double)rect.width > 5 || (double)rect.height / (double)rect.width < 0.2 )
{
continue ;
}
}
if ( cvContourArea(c) < 20 )
{
continue ;
}
cvDrawContours(
img_8uc3, //用于绘制轮廓的图像
c, //指向目前轮廓所在地址空间
CVX_RED, //外层轮廓颜色
CVX_BLUE, //内层轮廓颜色
0, //等级为0,绘制单独的轮廓
1, //轮廓线条粗细
8 //线段类型为(8邻接)连接线
);
printf("Contour #%d\n", n);
//输出第 n 个轮廓
n++;
}
cvShowImage("img_contour", img_8uc3);
//显示目前已绘制的轮廓图像
printf("Finished all contours. Hit ESC to finish\n");
while (cvWaitKey() != 27);
cvReleaseImage(&img_edge);
cvReleaseImage(&img_8uc3);
}
cvDestroyWindow("img_contour");
cvReleaseImage(&img_8uc1);
return 0;
}
代码注释还算仔细,我就不想多写了。
cvFindContours函数的更多相关文章
- 自己在总结前人经验下弄的几个opencv封装函数
第一个是增加对比度的函数,就是变亮. IplImage* EqualizeHistColorImage(IplImage *pImage) { IplImage *pEquaImage = cvCre ...
- matlab函数_连通区域
1. matlab函数bwareaopen──删除小面积对象格式:BW2 = bwareaopen(BW,P,conn)作用:删除二值图像BW中面积小于P的对象,默认情况下使用8邻域.算法:(1)De ...
- matlab函数bwareaopen的详解
matlab函数_连通区域 1. matlab函数bwareaopen──删除小面积对象格式:BW2 = bwareaopen(BW,P,conn)作用:删除二值图像BW中面积小于P的对象,默认情况下 ...
- 【转】matlab函数_连通区域
转载自einyboy的博文Matlab的regionprops详解 1. matlab函数bwareaopen──删除小面积对象格式:BW2 = bwareaopen(BW,P,conn)作用:删除二 ...
- OpenCV 轮廓基本特征
http://blog.csdn.net/tiemaxiaosu/article/details/51360499 OpenCV 轮廓基本特征 2016-05-10 10:26 556人阅读 评论( ...
- EmguCV 一些基本操作
http://www.cnblogs.com/alsofly/p/3524866.html?utm_source=tuicool&utm_medium=referral 一.先是在程序中图像的 ...
- OpenCV图像轮廓检测
轮廓检测: 轮廓检测的原理通俗的说就是掏空内部点,比如原图中有3*3的矩形点.那么就可以将中间的那一点去掉. 一.关键函数1.1 cvFindContours函数功能:对图像进行轮廓检测,这个函数将 ...
- 学习opencv跟轮廓相关的
查找轮廓 轮廓到底是什么?一个轮廓一般对应一系列的点,也就是图像中的一条曲线.表示的方法可能根据不同情况而有所不同.有多重方法可以表示曲线.在openCV中一般用序列来存储轮廓信息.序列中的每一个元素 ...
- MATLAB连通域标记函数
L = bwlabel(BW,n)返回一个和BW大小相同的L矩阵,包含了标记了BW中每个连通区域的类别标签,这些标签的值为1.2.num(连通区域的个数).n的值为4或8,表示是按4连通寻找区域,还是 ...
随机推荐
- tpot从elastic search拉攻击数据之三 用于拉取的java程序
package download; import org.json.JSONArray; import java.io.*; import java.net.URL; import java.net. ...
- DRF(1) - REST、DRF(View源码解读、APIView源码解读)
一.REST 1.什么是编程? 数据结构和算法的结合. 2.什么是REST? 首先回顾我们曾经做过的图书管理系统,我们是这样设计url的,如下: /books/ /get_all_books/ 访问所 ...
- python数据类型一(重点是字符串的各种操作)
一.python基本数据类型 1,int,整数,主要用来进行数学运算 2,bool,布尔类型,判断真假,True,False 3,str,字符串,可以保存少量数据并进行相应的操作(未来使用频率最高的一 ...
- 主机名 域名 网站名 URL
举几个域名的例子:google.com,baidu.com,163.com可以明确的告诉你,加上www,就不再是域名了! 以http://mail.163.com/index.html为例进行说明:1 ...
- JavaScript 函数,math对象,Date对象 序列化 总结
函数 函数定义 // 普通函数定义 function f1() { console.log("Hello world!"); } // 带参数的函数 function f2(a, ...
- 类型“Microsoft.Office.Interop.Word.ApplicationClass”未定义构造函数
错误 4317 无法嵌入互操作类型“Microsoft.Office.Interop.Word.ApplicationClass”.请改用适用的接口. 类型“Microsoft.Office.Inte ...
- solr 利用cul或solr界面单值更新
本文主要是指利用solr界面或cul的更新solr的值.如果需要代码中单值更新请参考黎明露珠的博客链接:http://www.cnblogs.com/limingluzhu/p/5535314.htm ...
- maven 不打包hbm 问题
<build> <resources> <resource> <directory>src/main/java</directory> &l ...
- xshell如何同时打开多个标签
查看标签>>>>>回话选项卡>>>>>> 打钩即可
- 完美修改iOS项目名
注意:重命名项目时,记得先备份好一份 1.选中旧项目名,改为新项目名: 选择rename: 2.修改相关文件夹名称: 3.全局搜索旧项目名称,然后替换为新项目名称: 4.经过步骤3的替换,再次全局搜索 ...