基于OpenCV软件的模拟表头图像处理技术研究外文翻译资料
2022-09-05 16:50:46
英语原文共 377 页,剩余内容已隐藏,支付完成后下载完整资料
1 图片功能
本章介绍操纵光栅图像的基本功能。
1.1 概论
OpenCV库代表了来自英特尔格式的IplImage图像处理(IPL)。 IPL参考手册给出了关于格式的详细信息。但是,为了完整性的同时,这里还简要地描述说明只有一小部分结构的最重要的领域。田野宽度和高度包含像素图像的宽度,高度和深度,包含有关像素值的类型的信息。在ipl.h头文件中列出的景深的所有可能的值包括:
IPL_DEPTH_8U - 无符号的8位整数(无符号字符)
IPL_DEPTH_8S - 有符号的8位整数(有符号字符或简单字符)
IPL_DEPTH_16S - 有符号的16位整数(短整型)
IPL_DEPTH_32S - 有符号的32位整数(INT)
IPL_DEPTH_32F - 32位浮点单精度值(浮点)。
在上述列表中在C中的相应类型被放置在括号中。参数N沟道装置图像中的色彩平面的数量。灰度图像包含单信道,而彩色图像通常包含三个或四个通道。该参数来源表示,无论是顶级图像的行( IPL_ORIGIN_TL)或底部图像的行(IPL_ORIGIN_BL)先存在内存中。视窗位图的起源通常是自下而上的,而在大多数其他环境中的图像顶级的起源。参数dataOrder表示,在色彩的色平面图像进行交织(dataOrder == IPL_DATA_ORDER_PIXEL)或单独的存在(dataOrder == IPL_DATA_ORDER_PLANE)。参数widthStep表示包含在同一列和连续的行的点之间的字节数。该参数宽度不足以计算距离,因为每一行可以是具有一定数目的字节,以实现图像的更快的处理的对齐,因此可以存在第i行的端部和第i 1行的开始之间的一些空隙。该参数的imageData包含指针图像数据的第一行。如果有图像中的几个独立的平面(当dataOrdIPL_DATA_ORDER_PLANE)它们被放置连续为单独的图像与高* N沟道行。它是可以选择的图像中的一些矩形部分或某一个颜色平面图像或两者都有,并且仅处理这部分。所选的矩形称为“地区利益“或投资回报率。结构的IplImage包含为此领域的投资回报率。如果指针不为NULL,它指向一个包含所选参数结构IPL的投资回报率,否则整个图像被认为选择。
不同于IPL,OpenCV的支持IplImage结构的一些限制:
——每个功能仅支持几个一定深度或信道的数目。
例如,图像数据的功能只支持单信道或深度IPL_DEPTH_8U,IPL_DEPTH_8S的三通道图像或IPL_DEPTH_32F。有关支持的图像格式的确切信息是通常包含在参数描述中或在其开始时已包含。这是IPL不同,试图以支持在每个一切可能的图像格式功能。
—— OpenCV中仅支持交错图像,不是平面的。
—— 该领域的ColorModel,channelSeq,BorderMode和BorderConst是忽略。
—— 字段对齐被忽略,widthStep只是代替它重新计算使用的字段宽度。
—— 字段maskROI和tileInfo必须为零。
—— COIsupport是非常有限的。现在只有图像统计函数接受COIval中的UE。
—— 所有的输入/输出图像的RIO必须完全匹配彼此。 例如,函数cvErode的输入和输出图像必须具有与ROI同等的大小。它不像IPL,这里的投资回报交集实际上是受到影响的。
尽管有这么多限制,OpenCV还支持最常用的图像可通过IplImage支撑,因而格式可以与可成功地使用IPL对可能的IplImage格式相同的子集。本章介绍的功能主要是捷径创造的操作,销毁IplImage的其他常见操作,并且它们常常是作为包装原始IPL函数实现的。
1.2 概论
本节介绍可用于快速和灵活地访问图像有用的宏像素。这些宏背后的基本思路如下:
1.介绍CV PixelAccess类型的一些结构。这些结构包含有关ROIa ND及其当前位置的所有信息。唯一的区别在于所有这些结构是数据类型,而不是信道的数目。
2.存在着快速版本用于在特定方向上移动,例如,CV_MOVE_LEFT,包装和非包装的版本。更复杂和更慢宏作为一个任意传递方向的移动参数。
3.大部分宏需要参数CS,指定数图像通道,使编译器能够去除多余的乘法如果图像具有单个信道,以及替代更快机在第三和第四信道的情况下对他们的说明。
2 动态数据结构
2.1概观
内存存储器用于为存储所有动态数据结构提供空间。一种存储由一个报头和一个双链表存储器块组成。这个清单被视为一个栈,即存储头包含指针到未完全占据的块和一个整数值。当在块中的空闲空间用完了,指针移动到下一个块,如果不存在下一个块,一个新的块被分配,然后加入到块的列表。所有的块具有相同,因此,该技术确保准确的内存分配,并避免内存碎片。
2.2 讨论
函数cvCreateMemStorage创建存储存储器和返回指针给它。最初,存储是空的。头的所有字段被设置为0,参数块大小必须为正或为零;如果参数等于0时,块大小被设定为默认值,目前为64K。
该函数cvCreateMemStorage创建类似于一个子存储器的存储器,存储除了在存储器中的差异分配/解除分配mechanism.当子存储需要一个新块添加到块列表,它会尝试从父块获取。第一个未使用的父块可用并从父块列表中排除。如果没有可用的块,父要么分配一个块或借用一个来自它自己的父。换句话说,链条或更复杂的结构,存储器存储区,其中的每个存储是另一个子/父是可能的。当一个子存储被释放甚至被清除,将返回所有父块。再次注意,在其它方面中,子存储是一样的简单存储。
该功能cvRelease MemStorage取消分配所有存储的内存块或将它们返回到父块。然后,它取消分配存储头和清除指向存储。换句话说,在存储器中的占用空间和自由空间是连续的。如果用户需要处理的数据,并把结果提供给存储,出现了有必要将要分配给临时结果的存储空间。在这种情况下,用户可以简单地写所有临时数据到单一的存储。保存/恢复在这种情况下无法正常工作。然而,创建子存储器,可以解决这个问题。该算法写入到两个存储器同时,并且一旦完成,将释放更多临时存储。
2.3 序列
序列是位于内存中的任意类型元素的可变数组存储。该序列是不连续的。序列数据可被划分成若干连续块,称为序列块,即可以位于不同的存储器块。序块被连接成一个圆形双链表来存储在几个内存块序列或保持几个小序列单内存块。该顺序从该序列的头部和尾部执行添加/删除元素提供快速功能,从而使序列实现一个双端队列。用于在序列的中间插入/取出元件的功能也可用,但他们更慢。该序列是许多其他动态基本类型库中的数据结构,就像所有这些类型,顺序不会被返回占领的内存来存储。然而序列保持在删除元素后释放内存的轨道序列,此内存反复使用。返回存储到存储器中,用户可以清除整个存储,也可以使用保存/恢复功能的位置,或保留子存储器临时数据。
列块构成一个圆形的双链表,因此指针prev和next永远不会为NULL,并指向以前和中下一个序列块序列。这意味着接下来的块是第一首块,prev块是最后的块。字段START_INDEX和count有助于跟踪块序列内的位置。例如,如果该序列由10个元素的和
分裂成三个块的3,5,和2的元素,并且第一块具有参数START_INDEX= 2,则对lt;START_INDEX,计数gt;为序列块lt;2,3gt;,lt;5,5gt;和lt;10,2gt;相应。第一参数START_INDEX块通常为0,除非一些元素在开头插入序列。
seqFlags 创建序列的标志。如果序列不传递到具有任何功能与特定类型序列的工作,该序列值可以等于0,否则适当类型必须从预定义的序列类型的列表中选择。
headerSize 序列标题的大小必须大于或等于sizeof(CvSeq)。如果特定类型或其延长指示,这类型必须符合基本类型头。
elemSize 在字节序列中的元素的大小必须与序列的类型一致。例如,对于点的序列是人为创建的,应指定元素类型CV_SEQ_ELTYPE_POINT,参数elemsize必须等于sizeof(CvPoint)。
2.4 讨论
函数cvCreateSeq创建一个序列和指针返回到它。该函数分配在存储块中的序列标题作为一个连续的块并填充参数elemsize,headerSize和存储与传递的值,设置参数deltaElems(见函数cvSetSeqBlockSize)设置为默认值,并清除其他领域。
注意:在记忆存储的所有标题,包括序列头和序列块标头,与该4字节边界对齐。
2.5讨论
cvSetSeqBlockSize 设置顺序块大小。
什么时候在内部序列缓冲器的自由空间用完时,则函数分配BLOCKSIZE字节的存储空间。如果此块紧跟前面分配时,两个块被连接,否则,将创建一个新的序列块。因此,参数越大,越低的序列片段中存储的空间被浪费了。当被创建的顺序在参数块大小设置为默认值为1K。该函数可以在调用任何后序时创建,并影响以后的分配。如果它比存储块大,或比序列标题大,则加上序列元件尺寸。接下来的四个功能cvSeqpush,cvSeqPop,cvSeqPushFront,cvSeq PopFront以从该序列中添加或删除元素一个结束。他们的时间复杂度为O(1),也就是说,所有这些操作不会移动现有的序列元素。
cvSeqPop 从序列结束删除元素。
功能cvSeqpop从该序列删除一个元素。函数报告序列已经为空的错误。
cvSeqRemove 从序列中间删除元素。
该功能删除指定索引的元素。如果索引为负的总数目越大,函数报告一个错误。该功能通过从序列索引的最近端移动序列中的元素。
cvClearSeq 清除序列。
函数cvCreateSeq清空序列。该函数不返回存储器,但这个存储器被再次使用时新元素被添加到原序列。这个函数时间复杂度为O(1)。
虽然下面的函数和宏说明在理论上是不相关的,因为像cvSeq Push和cvGetSeqElem功能,使用户能够写入序列并从中读,写/读函数和宏是非常有用的。
cvStartAppendToSeq 初始化写序列的过程。
该功能cvStart AppendTo序列初始化写的顺序。写入元素被添加到该序列的末端。请注意,写入期间中的其他操作可能会产生不正确的结果,甚至破坏序列(见函数cvFlushSeqWriter的讨论)。
cvFlushSeqWriter 更新顺序使用的状态头。
功能cvFlushSeqWriter旨在使用户阅读序列元素,例如,为了检查具体条件。该函数更新序列头进行读取该序列。
cvStartReadSeq 从初始化顺序读取过程序列。
该函数初始化cvStartReadSeq结构。从第一个到最后一个序列元件可通过后续调用读取宏CV_READ_SEQ_ELEM(ELEM,阅读器),过程类似于CV_WRITE_SEQ_ELEM,可用于从序列元件最后。序列块的一个圆形结构用于阅读过程中,即最后一个元素已被宏CV_READ_SEQ_ELEM读取时,当宏被再次调用时第一元件被读。这同样适用于CV_REV_READ_SEQ_ELEM。函数阅读过程不修改序列,也不要求任何临时缓冲区。读者现场ptr指向当前元素
2.6设置
该集结构主要是基于序列,但有一个完全不同的目的。如果一些元素已经从该序列的中间去掉,其它序列元件被移动到另一个位置引起其地址和指数变化。在这种情况下,所有的链接都必须重新固定。此问题的另一个方面是,从中间删除元素序列较为缓慢,随着时间为O(n)的复杂性,其中n是数序列中的元素。这个问题的解决办法在于使结构稀疏、无序,也就是说,每当结构元素被删除,其他元素必须留在原结构处,当一个新的元件插入结构中,空结构用来存储这个新元素。这组看起来像一个列表但保持结构元素之间没有任何联系。 然而,用户可以自由地使用并保持这样的列表。换句话说,一组是一个序列加自由区的列表。工作组的两种模式,第一种模式是使用指数参考序列中的一组的元素,而第二模式使用为同一指针模式。第一种模式是一个更好的选择,指针模式是快因为它不需要通过指数,这是在简单的序列完成找到元素集合相同的方式。在其中创建一组新的与新元素被添加到现有组在任一模式下是相同的,这两个方式之间的唯一差别在于元件从集合中移除。序列中,用户可以创建一组具有任意类型的元素,并指定头,然而,不能小于的sizeof(CVSET)的任何尺寸。在该组元件的尺寸受到限制同时不小于8字节,可由4整除解除此限制,如果集中已经无空间可用,这组元素的前4个字节的字段被用作指针指到下一个自由单元,使用户能够跟踪所有游离细胞。第二细胞的4个字节的字段包含当细胞占用要返回的细胞数。当用户删除了一组元素,而运行在索引模式下,会再次存储被释放的细胞。这就是为什么所有的元素都必须被4整除。在这种情况下,它们都用4个字节边界对齐,从而使所述显著位的地址始终为0。游离细胞的对应位被设置为1,为了得到实际地址,接下来的无细胞功能将屏蔽该位。另一方面,如果单元被占用,相应的位必须等于0。该组元件的第一个4字节字段的显著位必须为0,否则相应的细胞被认为是免费的。如果集合中的元素遵守这个限制,设定元件的第一字段指向另一组元件,那么剩下的唯一的限制是一个
剩余内容已隐藏,支付完成后下载完整资料
资料编号:[147224],资料为PDF文档或Word文档,PDF文档可免费转换为Word