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

第8章 轮廓虽然Canny之类的边缘检测算法可以根据像素间的差异检测出轮廓边界的像素,但是它并没有将轮廓作为一个整体。下一步是要把这些边缘像素组装成轮廓。现在你也许希望OpenCV中有一个方便的函数能实现这一步,事实上这个函数就是cvFindContours()。为了演示如何使用这些函数,本章从一些基本的问题入手。具体说来,我们会详细介绍内存存储器(memory storage)的概念,这是OpenCV在创建动态对象时存取内存的技术;然后是序列(sequence)基本介绍,在处理轮廓的时候通常需要使用序列。了解这些基本的概念后,我们就可以深入讨论轮廓检测的某些细节。最后我们将讨论轮廓检测的一些实际应用。目录内存序列查找轮廓Freeman链码轮廓例子另一个轮廓例子深入分析轮廓轮廓的匹配练习内存OpenCV使用内存存储器(memory storage)来统一管理各种动态对象的内存。内存存储器在底层被实现为一个有许多相同大小的内存块组成的双向链表,通过这种结构,OpenCV可以从内存存储器中快速地分配内存或将内存返回给内存存储器。OpenCV中基于内存存储器实现的函数,经常需要向内存存储器申请内存空间(特别是那些返回动态结果的函数)。内存存储器可以通过以下四个函数访问:CvMemStorage* cvCreateMemStorage( int block_size = 0);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指针)。序列序列是内存存储器中可以存储的一种对象。序列是某种结构的链表。OpenCV中,序列可以存储多种不同的结构。你可以将序列想象为许多编程语言中都存在的容器类或者容器类模板(如C++中的vector)。序列在内存被实现为一个双端队列(deque)。因此序列可以实现快速的随机访问,以及快速删除顶端的元素,但是从中间删除元素则稍慢些。序列中有一些重要的属性(参考例8-1)需要了解。首先,最常用到的是total成员,total存储序列中保存的数据的个数。其次是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中的许多对象一样,有一个分配函数能够创建一个序列,并返回指向所创建数据结构的指针。这个函数是cvCreat

文档评论(0)

1亿VIP精品文档

相关文档