提取轮廓两种方法及绘制轮廓中最大等级分析

几种方法用来提取图像轮廓的例子 参考了许多博客,自己整理了一下几种方法用来提取图像轮廓的方法,记录一下 阅读详情
/************************************************************************/  
/* 提取轮廓两种方法对比及绘制轮廓'最大等级'分析                         */  
/************************************************************************/  
#include "stdafx.h"  
#include "cv.h"  
#include "highgui.h"  
  
int main()  
{  
    IplImage* img = cvLoadImage("lena.jpg", CV_LOAD_IMAGE_GRAYSCALE);  
    IplImage* img_temp = cvCreateImage(cvGetSize(img), 8, 1);  
      
    cvThreshold(img, img, 128, 255, CV_THRESH_BINARY);  
      
    CvMemStorage* mem_storage = cvCreateMemStorage(0);  
    CvSeq *first_contour = NULL, *c = NULL;  
      
    
    //////////////////////////////////////////////////////////////////////////  
    // 1、  
    cvNamedWindow("contour1");  
    cvCopyImage(img, img_temp);  
	double t = (double)cvGetTickCount();
    cvFindContours(img_temp, mem_storage, &first_contour);  
    cvZero(img_temp);  
    cvDrawContours(  
        img_temp,   
        first_contour,  
        cvScalar(100),  
        cvScalar(100),  
        1  
        );  
	t = (double)cvGetTickCount() - t; 
    cvShowImage("contour1", img_temp);  
  
    printf("run1 = %gms\n", t/(cvGetTickFrequency()*1000.));  
      
    cvClearMemStorage(mem_storage);  
      
    
    //////////////////////////////////////////////////////////////////////////  
    // 2、  
    cvNamedWindow("contour2");  
    cvCopyImage(img, img_temp);  
	t = (double)cvGetTickCount();
    CvContourScanner scanner = cvStartFindContours(img_temp, mem_storage);  
    while (cvFindNextContour(scanner));  
    first_contour = cvEndFindContours(&scanner);  
      
    cvZero(img_temp);  
    cvDrawContours(  
        img_temp,   
        first_contour,  
        cvScalar(100),  
        cvScalar(100),  
        1  
        );  
	t = (double)cvGetTickCount() - t; 
    cvShowImage("contour2", img_temp);  
	
	printf("run2 = %gms\n", t/(cvGetTickFrequency()*1000.));  
      
    cvClearMemStorage(mem_storage);  
    cvReleaseImage(&img);  
    cvReleaseImage(&img_temp);  
  
    cvWaitKey();  

    /************************************************************************/  
    /* 经测试 run1 = 16.1431ms run2 = 15.8677ms (参考)
	   不过可以肯定这两中算法时间复杂度是相同的                                     */  
    /************************************************************************/  
      
    //////////////////////////////////////////////////////////////////////////  
    // 上述两种方法完成了对轮廓的提取,如想绘制轮廓都得配合cvDrawContours来使用  
    // 而cvDrawContours 函数第5个参数为 max_level 经查ICVL含义如下:  
    //  
    // 绘制轮廓的最大等级。如果等级为0,绘制单独的轮廓。如果为1,绘制轮廓及在其后的相同的级别下轮廓。  
    // 如果值为2,所有的轮廓。如果等级为2,绘制所有同级轮廓及所有低一级轮廓,诸此种种。如果值为负数,  
    // 函数不绘制同级轮廓,但会升序绘制直到级别为abs(max_level)-1的子轮廓。  
    //  
    // 相信好多读者初次都无法理解等级的含义,而且测试时候输入>=1 的整数效果几乎一样  
    // 只有提取轮廓时候的提取模式设为 CV_RETR_CCOMP CV_RETR_TREE 时这个参数才有意义  
    //  
    // 经查FindContours 函数里面这样介绍提取模式(mode)的这两个参数:  
    // CV_RETR_CCOMP - 提取所有轮廓,并且将其组织为两层的 hierarchy: 顶层为连通域的外围边界,次层为洞的内层边界。   
    // CV_RETR_TREE - 提取所有轮廓,并且重构嵌套轮廓的全部 hierarchy   
    //   
    // 下面用第一种方法进行测试  
  
    cvNamedWindow("contour_test");  
    cvNamedWindow("contour_raw");  
    img = cvLoadImage("contour.jpg", CV_LOAD_IMAGE_GRAYSCALE);  
    cvShowImage("contour_raw", img);  
    cvThreshold(img, img, 128, 255, CV_THRESH_BINARY);  
    img_temp = cvCloneImage(img);  
    cvFindContours(  
        img_temp,   
        mem_storage,   
        &first_contour,  
        sizeof(CvContour),  
        CV_RETR_CCOMP           //#1 需更改区域  
        );  
  
    cvZero(img_temp);  
    cvDrawContours(  
        img_temp,   
        first_contour,  
        cvScalar(100),  
        cvScalar(100),  
        1                       //#2 需更改区域  
        );  
    cvShowImage("contour_test", img_temp);  
    /************************************************************************/  
    /* (1, 2) = (CV_RETR_CCOMP, 1)  如图1 
       (1, 2) = (CV_RETR_CCOMP, 2)  如图2 
       (1, 2) = (CV_RETR_TREE, 1)   如图3 
       (1, 2) = (CV_RETR_TREE, 2)   如图4 
       (1, 2) = (CV_RETR_TREE, 6)   如图5 
       经分析CV_RETR_CCOMP 只把图像分为两个层次,顶层和次层,一等级轮廓只匹配与其最接近 
       的内侧轮廓即2等级 
       CV_RETR_TREE 则从轮廓外到内按等级1 - n 全部分配         
       CV_RETR_LIST 全部轮廓均为1级                        */  
    /************************************************************************/  
  
    cvWaitKey();  
    cvReleaseImage(&img);  
    cvReleaseImage(&img_temp);  
    cvReleaseMemStorage(&mem_storage);  
    cvDestroyAllWindows();  
    return 0;  
}  

 

原图

图一

图二


图三

图四

图五


OpenCV中的轮廓绘制与分析实战 OpenCV是一个开源的计算机视觉库,它包含大量用于图像处理和计算机视觉的函数。由于其性能优秀和易于使用,被广泛应用于学术界和工业界。函数允许用户自定义轮廓的颜色和厚度。这是通过函数的第四个参数来设置轮廓的颜色,第五个参数来设置轮廓的厚度实现的。在实际应用中,你可以根据特定的需求来设定这些参数。在二维空间中,凸包可以被理解为最简化的外围边界,它刚好包含了一组点集。直观上来说,如果我们有一组散乱的点,通过连接这些点,使得形成的多边形边界内的所有点都包含在内,那么这个最小多边形即为凸包。 阅读详情

相关推荐

Catia中如何取出曲线和曲面上点的坐标值

附图片和说明,非常详细。从Catia数据模中批量提升点的坐标值(曲面和曲线都试过,绝对可以用)!!!!

python二次开发CATIA:文字轮廓草图

本例中,基于 opencv 和 pillow两个库,先通过 PIL 将目标文字写到一张空白的图片中,然后再通过 opencv 的findContours 方法,提取该图片中的图形轮廓,最后提取轮廓中的坐标信息,并在CATIA 草图中绘制出相应的轮廓线条。CATIA V5 版本的草图中,并没有文字轮廓的创建命令。通常的做法是,再Drawing 文件中创建所需文本-->将 Drawing 文件另存为 dwg / dxf 格式-->打开另存的文件,文字已转为轮廓线条-->复制线条并粘贴到草图中。

T20151470的博客 1306

matlab最大物体边界轮廓的提取源程序

matlab 的图像特征提取比较实用 运算后的图转为uint8型 用半径为3的圆对图进行闭操作

catia 如何提取cgr面_CATIA 创成式外形设计精品课程

大家好,本次与大家分享创成式外形设计模块课程,创成式外形设计简称“创成式”或“GSD”,是一种常规曲面设计模块,可以使用点、线框和曲面特征快速创建外形满足设计要求。此模块包含了大量的曲面设计工具栏,其可以与freestyle模块配合用于外观造型设计,也可以与零件设计配合使用完成零部件实体建模。任何复杂的零件都是通过点做成线,线做成面,面做成实体。点:可以通过设置X,Y,Z建立点,比较重要的是可以根...

weixin_30276623的博客 4495

达梦--利用存储过程与定时任务实现数据自动迁移

本文详细介绍了在达梦数据库中如何结合存储过程与定时任务实现数据自动迁移。通过一个电商订单归档的实战案例,阐述了从设计表结构、编写具备异常处理和幂等性的存储过程,到配置DBMS_SCHEDULER定时任务的全流程。该方法能有效替代手动脚本,确保数据同步任务的稳定、准确与自动化执行,适用于报表准备、数据备份等多种场景。

weixin_29261711的博客 430

[kriging](一)网上下载的kriging克里金的C++程序的初步调试

笔者在网上下载了一份克里金的C++程序,水平有限,正在逐步地调试中。 初步 克里金法现在在许多软件都已经有集成了,据笔者所知: arcgis : 看过有的arcgis培训视频里面简略介绍了里面的插值方法,有克里金。 surfer :笔者用过这个,效果很好。 gocad :听说有 landmark &jason :研究生时候用的专业的石油物探软件,里面有克里金法,万恶的开始。 pykrig...

FOREST优快云 5610

【CATIA V5】如何绘制三维线图/提取三维模型的轮廓?

可用于专利/论文线图说明。本人在B站的古早技术帖。

RickyWasYoung的博客 612

EV1527、PT2262傻傻分不清?一文讲透常见315/433MHz遥控编码协议区别与选型

本文深度对比了EV1527、PT2262和SC5262三种常见的315/433MHz遥控编码协议,详细解析了它们的技术特点、成本效益和适用场景。EV1527作为低成本方案的首选,特别适合智能家居和简易安防设备;PT2262在稳定性和兼容性上表现优异;而SC5262则在安全性方面具有显著优势。文章还提供了实用的选型框架和工程建议,帮助开发者在不同应用场景中做出最优决策。

weixin_33640562的博客 349

catia投图只投外轮廓线,4.3.3.13-Catia曲面之一条引导线和切面扫略

本节内容主要介绍了Catia曲面之一条引导线和切面扫略,视频时长7分52秒。注意其扫掠半径必须大于或者等于引导曲线到切面的最小距离,否则就会弹出无解警告。学习时注意该扫掠方式创建曲面的原理。欢迎在线观看。简要操作步骤:1选择XZ平面为草图基准面,进入草图模块,利用三点圆弧或者圆和直线而后对其进行修剪,完成草图绘制。单击拉伸按钮,对其沿Z轴拉伸其长度可通过命令对话框来输入也可直接在图形中拖拉箭头来指...

weixin_39652646的博客 2954

SpringBoot实战——仿b站项目(一)

热部署就是当应用程序这种运行的时候升级冉家或者修改某一部分代码、配置文件时,无需手动启动应用,即可修改的部分生效工具 + IDEA配置。

weixin_52880572的博客 3455

小米手机Magisk解锁与Root完整指南:从Bootloader到模块管理

Android系统Root权限获取是设备深度定制的核心技术之一,其核心原理在于通过修改系统启动流程获取超级用户权限。Systemless Root技术通过动态挂载修改,在不触碰系统分区的前提下实现功能注入,既保证了系统完整性,又能绕过完整性检测。这一技术为设备带来了极高的可定制性,用户可以通过模块化方式增强系统功能、修改UI界面或启用隐藏特性。在小米手机生态中,由于官方提供了完整的Bootloader解锁通道,结合Magisk的无系统修改Root方案,使得安全可控的深度定制成为可能。本文聚焦于Bootloa

weixin_29164185的博客 333

CATIA高效工作指南——零件建模篇(一)

CATIA高效工作指南——零件建模篇(一)

KE17RS的博客 2817

2025年全国青少年信息素养大赛初赛真题(算法创意实践挑战赛C++初中组:文末附答案)

2025年全国青少年信息素养大赛初赛真题(算法创意实践挑战赛C++初中组:文末附答案)

王老师青少年编程 3396

OpenCV——轮廓检测之FindContours,提取轮廓两种方法及绘制轮廓中最大等级分析

/************************************************************************/ /* 提取轮廓两种方法对比及绘制轮廓'最大等级'分析 */ /*****************************************************************...

优快云131137的博客 1万+

【PCL常用分割器】SACSegmentation

是一种基于采样一致性(Sample Consensus)的点云分割方法。它通过从点云中选取少量样本,拟合参数化几何模型(如平面、圆柱),并评估所有点与模型的误差一致性,最终选择内点集合最优的模型作为分割结果。与其他分割器(Region Growing、EuclideanClusterExtraction)不同,它不依赖空间连通性,而是依赖几何一致性。

yijiujiusan的博客 1309

如何合理评估信号过孔的残桩效应--Via Stub

设计中,之所以会去考察信号过孔的残桩效应(Via Stub),是因为它的存在导致了不需要的频率谐振,当这些谐振出现在所关注的信号通道的插入损耗中时,就会引发较为严重的信号完整性(SI)问题,那么Via Stub到底是如何引发SI问题的呢?

一只豌豆象的博客 4466

OpenCV函数cvFindContours轮廓提取

提取轮廓在OpenCV里有一个函数 cvFindContours :[cpp] view plaincopyint cvFindContours( CvArr* image, CvMemStorage* storage, CvSeq** first_contour,int header_size=sizeof(CvContour),int mode=CV_RETR_LIST,int method=

LX 3056

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

OpenCV函数cvFindContours

提取轮廓在OpenCV里有一个函数 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_SIMP

Augusdi的专栏 7万+

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

二值图像分析:二值图像轮廓提取

二值图像分析:二值图像轮廓提取与分析 OpenCV的轮廓发现API获取二值图像的轮廓拓扑信息,轮廓发现API如下: void cv::findContours( InputOutputArray image, OutputArrayOfArrays contours, OutputArray hierarchy, int mode, int method, Point offset = Point() ) 其中image表示输入图像,它必须是二值图像,二值图像可以由threshold、Can

Hundreays 7508

python --opencv图像处理轮廓(寻找轮廓、绘制轮廓)详解

轮廓是一系列相连的点组成的曲线,代表了物体的基本外形,相对于边缘,轮廓是连续的,边缘并不全部连续。

weixin_44634704的博客 1万+

二值图像分析—提取最大轮廓与编码关键点

基本操作: 读取图片 图片灰度化 图片二值化 图片形态学——闭操作 提取轮廓 筛选最大的轮廓——根据轮廓面积 绘制轮廓关键点与轮廓 void getMaxContourAndContourPoint(Mat &src) { //2. 图片灰度化 Mat gray; cvtColor(src, gray, COLOR_BGR2GRAY); //3. 图片二值化 Mat bin...

WaitFoF 1578

【OpenCV函数】轮廓提取;轮廓绘制;轮廓面积;外接矩形

FindContours 在二值图像中寻找轮廓 int cvFindContours( CvArr* image, CvMemStorage* storage, CvSeq** first_contour, int header_size=sizeof(CvContour), int mode=CV_RETR_LIST, int method=CV_...

dianwu9730的博客 800

【OpenCV】74 二值图像分析—提取最大轮廓与编码关键点

74 代码 实验结果 解释 优点 所有内容均来源于贾志刚老师的知识星球——OpenCV研习社,本文为个人整理学习,已获得贾老师授权,有兴趣、有能力的可以加入贾老师的知识星球进行深入学习。 ...

刘小胖的博客 1428
上一篇: 《学习openCV》例程解析 ex_9_3(codeBook模型实现背景减除)
下一篇: 《学习openCV》例程解析 ex_9_3_ex(codeBook + 连通净化)
zcube
博客等级 码龄17年 170粉丝 120原创
评论 3
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值