IplImage* contours_rect;
IplImage* contours;
CvMemStorage* countours_storage=NULL;
if(contours_rect==NULL)
{
contours_rect=cvCreateImage(cvSize(video_width,video_height),IPL_DEPTH_8U,);
}
if(contours==NULL)
{
contours=cvCreateImage(cvSize(video_width,video_height),IPL_DEPTH_8U,);
}else{
memcpy(contours->imageData,fgedge->imageData,fgedge->height*fgedge->width);
}
if(countours_storage==NULL)
{
countours_storage=cvCreateMemStorage();
}else{
cvClearMemStorage(countours_storage);
}
CvSeq* firstContour=NULL;
int contours_num=cvFindContours(contours,countours_storage,&firstContour); //查找所有轮廓
cvZero(contours); //图像置为全黑
CvSeq* contourlonger=NULL; //虽然赋值为NULL 但是实际上不是的
CvSeq* temp=NULL;
int n_contours=;
for(;firstContour->h_next!=NULL;firstContour=firstContour->h_next)
{
double contours_length=cvContourPerimeter(firstContour); //获取每个轮廓的长度信息
double contours_area=cvContourArea(firstContour); //获取每个轮廓的面积值
//cout<<contours_length<<endl;
if(contours_length>&&contours_length<&&contours_area>/*&&contours_length/contours_area<4*/) //根据长度面积信息挑选符合条件的序列重组
{
if(n_contours==)
{
temp=cvCloneSeq(firstContour); //直接等于会使原来的序列被破坏
contourlonger=temp;
}else{
temp->h_next=cvCloneSeq(firstContour);
temp=temp->h_next;
}
n_contours++;
} } if(contourlonger)
{
cvDrawContours(contours,contourlonger,cvScalarAll(),cvScalarAll(),);//第5个参数-1表示采用填充的方式
}
cvShowImage("Contours",contours); //获取边界框
memcpy(contours_rect->imageData,contours->imageData,fgedge->height*fgedge->width);
if(contourlonger!=NULL)
{
for(;contourlonger->h_next!=NULL;contourlonger=contourlonger->h_next)
{
//得到不一定平行于图片的最小面积矩形框
CvBox2D contours_box=cvMinAreaRect2(contourlonger);
CvPoint2D32f point4[];
cvBoxPoints(contours_box,point4); //得到contours_box四个角的坐标
CvPoint pt[];
for(int i=;i<;i++)
pt[i]=cvPoint((int)point4[i].x,point4[i].y);
CvPoint* ppt=pt;
int count=;
cvPolyLine(contours_rect,&ppt,&count,,,cvScalarAll(),);
//下面得到的是平行于图片的矩形框
//CvRect contours_boundary=cvBoundingRect(contourlonger); //这样得到的矩形坐标和长宽都是0 不知道为什么
//cvRectangle(contourlonger,cvPoint(contours_boundary.x,contours_boundary.y),cvPoint(contours_boundary.x+contours_boundary.width,contours_boundary.y+contours_boundary.height),cvScalarAll(255));
}
}
cvShowImage("Contours_boundary",contours_rect);

我已经通过其他方法提取了轮廓 用OPENCV的函数查找更完整的轮廓 并且根据轮廓的长度和面积信息将轮廓序列做一个选择性处理 最后画出外接矩形框。

在对轮廓做选择性处理的时候 发现虽然新建CvSeq* 赋值为了NULL 但实际上不是的 它本身有一个地址值 因此 不能通过(指针!=NULL )来初始化第一个序列 因此引入了n_contours。 CvCloneSeq函数也仅仅是复制当前的序列,它的前驱和后继是没有被复制过来的,需要每一次都使用复制函数。

first  3    5    2    9    1    7    8    2        设序列长度   //若只要大于5的

---》---》---》--》-》--》--》---》

temp:clone(5)-->clone(9)--->clone(7)-->clone(8)-->NULL

contours :指向新建的头指针

【opencv】轮廓相关的更多相关文章

  1. 学习opencv跟轮廓相关的

    查找轮廓 轮廓到底是什么?一个轮廓一般对应一系列的点,也就是图像中的一条曲线.表示的方法可能根据不同情况而有所不同.有多重方法可以表示曲线.在openCV中一般用序列来存储轮廓信息.序列中的每一个元素 ...

  2. OpenCV 轮廓基本特征

     http://blog.csdn.net/tiemaxiaosu/article/details/51360499 OpenCV 轮廓基本特征 2016-05-10 10:26 556人阅读 评论( ...

  3. css中的大小、定位、轮廓相关属性

    css中的大小.定位.轮廓相关属性 1.通过height.width属性控制组件大小 height:高度,可以设置任何有效的距离值: width:宽度,可以设置任何有效的属性值: max-height ...

  4. OpenCV轮廓vectorvector

    OpenCV轮廓vectorvector,vector,vector,vector https://blog.csdn.net/Ahuuua/article/details/80593388   轮廓 ...

  5. opencv轮廓提取、轮廓识别相关要点

    1.轮廓提取 src = cv2.imread("***.jpg", cv2.IMREAD_COLOR) gray = cv2.cvtColor(src ,cv2.COLOR_BG ...

  6. opencv轮廓外接矩形

    1.寻找轮廓 api void cv::findContours( InputOutputArray image, OutputArrayOfArrays contours, OutputArray ...

  7. 【转载】openCV轮廓操作

    声明:非原创,转载自互联网,有问题联系博主 1.轮廓的提取 从图片中将目标提取出来,常常用到的是提取目标的轮廓. OpenCV里提取目标轮廓的函数是findContours(), 它的输入图像是一幅二 ...

  8. opencv轮廓处理函数详细

    ApproxChains 用多边形曲线逼近 Freeman 链 CvSeq* cvApproxChains( CvSeq* src_seq, CvMemStorage* storage, int me ...

  9. OpenCV 轮廓检测

    使用OpenCV可以对图像的轮廓进行检测.这是之前用过的代码,挺简单的,回顾一下.主要要进行以下2步操作: 1.cvThreshold():对图像进行二值化处理 2.cvFindContours(): ...

随机推荐

  1. 利用CSS实现带相同间隔地无缝滚动动画

    说明:因为在移动上主要利用CSS来做动画,所以没有考虑其他浏览器的兼容性,只有-webkit这个前缀,如果需要其他浏览器,请自行补齐. 首先解释一下什么是无缝滚动动画, 例如下面的例子 See the ...

  2. LYDSY模拟赛day9 2048

    /* 大模拟题,做的时候思路还是比较清晰的 */ #include<iostream> #include<cstdio> #include<string> #inc ...

  3. activiti数据库表结构全貌解析

    http://www.jianshu.com/p/e6971e8a8dad 下面本人介绍一些activiti这款开源流程设计引擎的数据库表结构,首先阐述:我们刚开始接触或者使用一个新的东西(技术)时我 ...

  4. UI第一节—— UILable

    1.首先说说怎么创建UI程序,打开xcode,选择Create  a new Xcode project.看如下截图 2,接下来就蹦出一个和写OC应用差不多的界面,不多解释了 3.我给工程取得名字就叫 ...

  5. CSS只是要点-收集

    1. CSS 浮动定位详解 请点击:css浮动定位详解

  6. 非阻塞SOCKET套接字connect等待时间的实现

     SOCKET cClient;     cClient=socket(AF_INET,SOCK_STREAM,0);     //设置为非阻塞套接字     int iMode = 1;     i ...

  7. 查询oracle数据库中的所有表空间信息

    "空闲比例" totalspace,sum(t.blocks) totalblocks from dba_data_files t group by t.tablespace_na ...

  8. Codeforces 271 Div 2 C. Captain Marmot

    题目链接:http://codeforces.com/contest/474/problem/C 解题报告:给一个n,然后输入4*n个平面坐标系上的点,每四个点是一组,每个点有一个中心,这四个点可以分 ...

  9. iOS开发——多线程篇——GCD

    一.基本概念 1.简介什么是GCD全称是Grand Central Dispatch,可译为“牛逼的中枢调度器”纯C语言,提供了非常多强大的函数 GCD的优势GCD是苹果公司为多核的并行运算提出的解决 ...

  10. Windows8笔记

    一.WIN8 硬盘变为可弹出设备 如果电脑使用的是nforce芯片组的主板和串口硬盘.在系统中安装好所有的硬件驱动程序后,会出现这种情况.这是nforce芯片组在安装了IDE-SW主板驱动以后,系统会 ...