【opencv】轮廓相关
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】轮廓相关的更多相关文章
- 学习opencv跟轮廓相关的
查找轮廓 轮廓到底是什么?一个轮廓一般对应一系列的点,也就是图像中的一条曲线.表示的方法可能根据不同情况而有所不同.有多重方法可以表示曲线.在openCV中一般用序列来存储轮廓信息.序列中的每一个元素 ...
- OpenCV 轮廓基本特征
http://blog.csdn.net/tiemaxiaosu/article/details/51360499 OpenCV 轮廓基本特征 2016-05-10 10:26 556人阅读 评论( ...
- css中的大小、定位、轮廓相关属性
css中的大小.定位.轮廓相关属性 1.通过height.width属性控制组件大小 height:高度,可以设置任何有效的距离值: width:宽度,可以设置任何有效的属性值: max-height ...
- OpenCV轮廓vectorvector
OpenCV轮廓vectorvector,vector,vector,vector https://blog.csdn.net/Ahuuua/article/details/80593388 轮廓 ...
- opencv轮廓提取、轮廓识别相关要点
1.轮廓提取 src = cv2.imread("***.jpg", cv2.IMREAD_COLOR) gray = cv2.cvtColor(src ,cv2.COLOR_BG ...
- opencv轮廓外接矩形
1.寻找轮廓 api void cv::findContours( InputOutputArray image, OutputArrayOfArrays contours, OutputArray ...
- 【转载】openCV轮廓操作
声明:非原创,转载自互联网,有问题联系博主 1.轮廓的提取 从图片中将目标提取出来,常常用到的是提取目标的轮廓. OpenCV里提取目标轮廓的函数是findContours(), 它的输入图像是一幅二 ...
- opencv轮廓处理函数详细
ApproxChains 用多边形曲线逼近 Freeman 链 CvSeq* cvApproxChains( CvSeq* src_seq, CvMemStorage* storage, int me ...
- OpenCV 轮廓检测
使用OpenCV可以对图像的轮廓进行检测.这是之前用过的代码,挺简单的,回顾一下.主要要进行以下2步操作: 1.cvThreshold():对图像进行二值化处理 2.cvFindContours(): ...
随机推荐
- Hibernate get和load区别
1.从返回结果上对比:load方式检索不到的话会抛出org.hibernate.ObjectNotFoundException异常get方法检索不到的话会返回null 2.从检索执行机制上对比: ...
- BZOJ1455——罗马游戏
1.题目大意:维护一个数据结构,可以实现合并操作,还能询问最小值 2.分析:这种问题当然是可并堆啦 随便写了一个左偏树QAQ #include <cstdio> #include < ...
- OpenGL中平移、旋转、缩放矩阵堆栈操作
在OpenGL中,图元的几何变换均为线性变换,通过矩阵变换实现.OpenGL中的坐标用齐次坐标表示,即(x,y,z)表示成(x',y',z',h),其中x=x'/h; y=y'/h; z=z'/h. ...
- 汉诺塔(河内塔)算法 ----C语言递归实现
汉诺塔:汉诺塔(又称河内塔)问题是源于印度一个古老传说的益智玩具.大梵天创造世界的时候做了三根金刚石柱子, 在一根柱子上从下往上按照大小顺序摞着64片黄金圆盘.大梵天命令婆罗门把圆盘从下面开始按大小顺 ...
- C++基础知识(2)---函数
c++中的函数和C语言中的函数相比,增加了许多新的语法与功能.在这里总结一下c++中常用的引用函数,函数重载和内联函数. 1 引用参数 引用参数最常用的一个例子就是 交换 两个数,如下 void s ...
- 分享一个快速设置背景的js 自动获取背景图的长宽
我来分享一个快速设置背景的js (需要jq支持!) 快速切图铺页面用---就是不需要手动输入背景图的长宽 自动获取背景图的长宽 : <div class="wrap"> ...
- ajax初探01
1.为什么使用ajax ajax使用异步处理模型,意味着在浏览器等待数据加载期间,用户可以做其他事情 在页面正在加载时使用ajax:使用ajax,浏览器可以向服务器请求一些数据,并且一旦数据请求发出, ...
- COGS 2421.[HZOI 2016]简单的Treap 题解
题目大意: 给定n个数及其优先级,求对应的符合最小堆性质的Treap的先序遍历. n<=500000. 解法: 目前为止我只想到了三种解法,其中第三种是正解. 1.暴力1 以优先级为关键字排序, ...
- c随机数&运行时间
#include<stdlib.h> #include<time.h> srand((unsigned) time(NULL)); //用时间做种,每次产生随机数不一样 pri ...
- ubuntu下ssh使用proxy:corkscrew
1,安装corkscrew: sudo apt-get install corkscrew 2, 配置 vim ~/.ssh/config 写入如下: Host 10.1.*.* ProxyComma ...