网站大量收购独家精品文档,联系QQ:2885784924

《学习OpenCV》第8章轮廓精要.pptx

  1. 1、本文档共116页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
《学习OpenCV》第8章轮廓精要

第8章 轮廓;虽然Canny之类的边缘检测算法可以根据像素间的差异检测出轮廓边界的像素,但是它并没有将轮廓作为一个整体。下一步是要把这些边缘像素组装成轮廓。现在你也许希望OpenCV中有一个方便的函数能实现这一步,事实上这个函数就是cvFindContours()。为了演示如何使用这些函数,本章从一些基本的问题入手。具体说来,我们会详细介绍内存存储器(memory storage)的概念,这是OpenCV在创建动态对象时存取内存的技术;然后是序列(sequence)基本介绍,在处理轮廓的时候通常需要使用序列。了解这些基本的概念后,我们就可以深入讨论轮廓检测的某些细节。最后我们将讨论轮廓检测的一些实际应用。;目录;内存;void cvReleaseMemStorage( CvMemStorage** storage ); void cvClearMemStorage( CvMemStorage* storage ); void* cvMemStorageAlloc( CvMemStorage* storage ); cvCreateMemStorage用于创建一个内存存储器。参数block_size对应内存存储器中每个内存块的大小。 如果block_size为0,则表示内存块采用默认的大小,内存块默认的大小为64KB。该函数返回一个新创建的内存存储器指针。;cvReleaseMemStorage函数通过storage获取有效的内存存储器的地址,然后释放该内存存储器的所有空间。该函数的用法和OpenCV中释放图像、释放矩阵或者释放其他结构的函数方法类似。 cvClearMemStorage函数则用于清空内存存储器。注意,该函数是仅有的一种释放内存存储器中分配的内存的方法。该函数和通常释放内存的函数区别是,它只是将释放的内存返还给内存存储器,而并不返还给系统。实际上,通过cvClearMemStorage,我们可以很方便地重复使用内存存储器中内存空间。注意,删除任何动态对象(如CvSeq、CvSet等)并不会将内存返还给内存存储器(这些结构通过在内部创建一个内存存储器以达到内存重复利用的目的)。 就像malloc()可以从堆中分配空间一样,OpenCV中的cvMemStorageAlloc也可以从一个内存存储器中申请空间。只需要向cvMemStorageAlloc指定一个内存存储器;和要申请的内存空间大小,然后返回分配内存的地址(返回值和malloc一样为void指针)。 ;序列;保存的数据的个数。其次是h_prev,h_next,v_prev,和v_next,它们是CV_TREE_NODE_FIELDS的一部分,指向其他的序列(分别为上下左右四个方向)。这4个指针不是用来访问序列中的元素,而是用来链接不同的序列。OpenCV中也有其他的结构包括CV_TREE_NODE_FIELDS,我们可以使用包含CV_TREE_NODE_FIELDS的结构构造出更复杂的结构,例如队列、树、图等。仅仅使用变量h_prev和h_next,可实现一个简单的链表。另外两个变量v_prev和v_next可以用于创建那些比较密切的复杂的拓扑结构。通过这四个变量,函数cvFindContours可以将图像中的复杂的轮廓构造为轮廓树。 例8-1:结构CvSeq的定义 ; ;创建序列 前面已经介绍了序列的结构。实际上,很多OpenCV函数可以返回序列。当然,我们也可以自己用cvCreateSeq函数手工创建序列。跟OpenCV中的许多对象一样,有一个分配函数能够创建一个序列,并返回指向所创建数据结构的指针。这个函数是cvCreateSeq()。 CvSeq* cvCreateSeq( int seq_flags, int header_size, int elem_size, CvMemStorage* storage ); 调用这个函数首先需要知道一些信息,这些信息用于控;制创建的序列采用何种方式来组织数据。还需要序列的头大小(通常为sizeof(CvSeq)),以及序列要存储的元素的大小。最后,还需要为序列指定一个内存存储器,这样当序列要添加元素时,便会从内存存储器申请空间。 flags变量可由3个类值组成,不同类之间的标志可以用或运算来组合。第一类确定序列中元素的类型,多数类型用户可能不熟悉,另外一些类型则为OpenCV的内部函数使用。还有一些标志仅仅用于特定的元素类型,例如CV_SEQ_FLAG_CLOSED通常用于表示一个闭合的多边形。 CV_SEQ_ELTYPE_POINT 点坐标:(x, y) CV_SEQ_ELTYPE_CODE Freeman:0..7 CV_SEQ_ELTYPE_PPOINT 指向一个点的指针: (

文档评论(0)

586334000 + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档