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

几种方法用来提取图像轮廓的例子 参考了许多博客,自己整理了一下几种方法用来提取图像轮廓的方法,记录一下 阅读详情
/************************************************************************/  
/* 提取轮廓两种方法对比及绘制轮廓'最大等级'分析                         */  
/************************************************************************/  
#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

告别命令行恐惧!用nTopology可视化工具5分钟搞定三维Voronoi泡沫建模

本文介绍如何利用nTopology可视化工具快速生成三维Voronoi泡沫结构,无需编程即可完成复杂建模。Voronoi结构在轻量化设计、能量吸收和生物医学等领域具有重要应用,传统命令行方法门槛较高。通过nTopology的四步流程,用户可在5分钟内创建仿真就绪模型,大幅提升设计效率。

weixin_30764771的博客 426

模型参考自适应控制(MRAC):让PID参数动态优化

本文深入解析模型参考自适应控制(MRAC)技术,它通过实时调整PID参数,使控制系统能自动适应系统特性变化和外部干扰。文章详细介绍了MRAC的工作原理、数学基础,并提供了用C语言实现的实战代码示例,帮助工程师解决传统PID控制在非线性、时变系统中参数整定繁琐的难题。

tequila的博客 903

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

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

RickyWasYoung的博客 612

PL端:HDMI 输出实验

开发板没有HDMI编码芯片,是将FPGA的3.3差分IO直接连接到HDMI连接器,FPGA 完成 24 位 RGB 编码输出TMDS 差分信号。1、学会使用第三点IP核,首先是添加,后面的使用和自带IP核操作一致。2、主要还是在梳理vivado使用流程。

qq_43441284的博客 4287

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

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

weixin_39652646的博客 2954

6.4 直流无刷电机(BLDC):测试与性能评估

本文系统阐述了直流无刷电机(BLDC)的测试与性能评估方法,涵盖参数测量、性能测试、测试平台设计及可靠性评估。详细介绍了绕组电阻、电感和反电动势的测量原理与修正方法,以及转矩-转速特性、效率分析和动态响应测试的技术要点。通过搭建高精度测功机系统,结合自动化数据处理,实现对电机性能的全面评估。最后讨论了温升、振动、EMC等特殊测试方法,为BLDC电机的设计验证和质量控制提供了完整的技术路径。

技术工作者 442

i.MX6ULL系统移植 | 使用busybox制作根文件系统(1.29.0)

一. 下载BusyBox BusyBox是一个继承了大量Linux命令核工具的软件,像常用的ls、cp、mv、ifconfig等命令。一般下载BusyBox的源码,然后配置Busybox,选择自己想要的功能,最后编译即可。 BusyBox在官方可以直接下载:https://www.busybox.net/。目前最新是1.35.0,这里我使用1.29.0版本。 axel https://www.busybox.net/downloads/busybox-1.29.0.tar.bz2 下载之后解压: tar

Mculover666的博客(嵌入式) 1145

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

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

KE17RS的博客 2817

【Simulink教程案例18】基于simulink的基础OFDM+64QAM发射接收链路仿真

OFDM(Orthogonal Frequency Division Multiplexing)即正交频分复用技术,实际上OFDM是MCM(Multi Carrier Modulation),多载波调制的一种。通过频分复用实现高速串行数据的并行传输, 它具有较好的抗多径衰落的能力,能够支持多用户接入。OFDM技术由MCM(Multi-Carrier Modulation,多载波调制)发展而来。OFDM技术是多载波传输方案的实现方式之一,它的。

FPGA/MATLAB学习教程/源码/项目合作开发 1988

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

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

优快云131137的博客 1万+

Siemens SIMATIC软件二次开发:使用C#进行SIMATIC软件二次开发

通过使用OPC-UA通信协议和S7通信库,可以有效地在C#应用程序中与Siemens SIMATIC软件进行数据交换。OPC-UA提供了一个标准化的平台,而S7通信库则提供了直接访问PLC数据的能力。掌握这两种通信方式,将极大地增强在工业自动化领域的二次开发能力。在Siemens SIMATIC软件中,自定义功能块开发是实现二次开发的关键步骤之一。通过C#,可以创建高度定制化的功能块,以满足特定的控制需求。下面,我们将通过一个示例来展示如何使用C#开发一个自定义功能块。OPC-UA通信。

kkchenjj的博客 1415

C#【必备技能篇】Winform实现多语言切换(.resx文件的应用)

在实际的项目开发中,软件需要实现多语言切换。本文通过一个实际的例子,可以让你学习到这个技能。

星Yeah 的博客 1万+

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

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

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万+

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

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

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

Hundreays 7508

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

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、付费专栏及课程。

余额充值