OpenCV——CvSeq动态结构序列

动态结构序列CvSeq是所有OpenCV动态数据结构的基础。

分为两类:

  • 稠密序列
  • 稀疏序列

(1) 稠密序列都派生自CvSeq,他们用来代表可扩展的一维数组 — 向量、栈、队列和双端队列。数据间不存在空隙(连续存储)。如果元素元素从序列中间被删除或插入新的元素到序列,那么此元素后边的相关元素全部被移动。

(2)稀疏序列派生自CvSet,CvSet也是基于CvSeq的,他们都是由节点所组成,每一个节点要么被占用,那么为空,由标志位flag决定。这些序列作为无序数据结构被使用,如点集合、图、Hash表等。

CvSeq的定义如下:

<span style="color:#ff0000; font-style:italic">/*
   Read/Write sequence.
   Elements can be dynamically inserted to or deleted from the sequence.
*/</span>
<span style="color:#339900">#define CV_SEQUENCE_FIELDS()                                              \
    CV_TREE_NODE_FIELDS(CvSeq);                                           \
    int       total;          /* Total number of elements.            */  \
    int       elem_size;      /* Size of sequence element in bytes.   */  \
    schar*    block_max;      /* Maximal bound of the last block.     */  \
    schar*    ptr;            /* Current write pointer.               */  \
    int       delta_elems;    /* Grow seq this many at a time.        */  \
    CvMemStorage* storage;    /* Where the seq is stored.             */  \
    CvSeqBlock* free_blocks;  /* Free blocks list.                    */  \
    CvSeqBlock* first;        /* Pointer to the first sequence block. */</span>  

<span style="color:#00ff00">typedef</span> <span style="color:#00ff00">struct</span> CvSeq
<span style="color:#080000">{</span>
    CV_SEQUENCE_FIELDS<span style="color:#080000">(</span><span style="color:#080000">)</span>
<span style="color:#080000">}</span>
CvSeq<span style="color:#080800">;</span>  
/*
total表示稠密序列的元素个数,或者稀疏序列被分配的节点数。
elem_size表示序列中每个元素占用的字节数。
block_max是最近一个内存的最大边界指针。
ptr表示当写指针。
delta_elems表示序列间隔尺寸。
storage指向序列存储的内存块的指针。
free_blocks表示空的块列表。
first指向第一个序列块。

h_next和h_prev并不是指向CvSeq内部元素的指针,它们是指向其它CvSeq的。
*/

有关CvSeq的函数

//创建序列
CvSeq* cvCreateSeq(int seq_flags,int header_size,int elem_size,CvMemStorage* storage)

//复制序列
CvSeq* cvCloneSeq(const CvSeq* seq,CvMemStorage* storage=NULL)

//逆序序列
Void cvSeqInvert(CvSeq* seq)

//序列排序
Void cvSeqSort(CvSeq* seq,CvCmpFunc func,void *userdata=NULL)

//查询元素
Char* cvSeqSearch(CvSeq* seq,const void* elem,CvCmpFunc func,int is_sorted,int *elem_idx,void *userdata=NULL)

//清空序列
Void cvClearSeq(CvSeq* seq);
//添加删除元素

//尾部添加
Char* cvSeqPush(CvSeq* seq,void* element=NULL);

//尾部删除
void cvSeqPop(CvSeq* seq,void* element=NULL);

//头部添加
Char* cvSeqPushFront(CvSeq* seq,void* element=NULL);

//头部删除
Void cvSeqPopFront(CvSeq* seq,void* element=NULL);

//添加多个元素
Void cvSeqPushMulti(CvSeq* seq,void* elements,int count,int in_front=0);

//删除多个元素
Void cvSeqPopMulti(CvSeq* seq,void* elements,int count,int in_front=0);

//指定位置添加元素
Char* cvSeqInsert(CvSeq* seq,int before_index,void* element=NULL);

//指定位置删除元素
Void cvSeqRemove(CvSeq* seq,int index);
//返回指定元素的指针
Char* cvGetSeqElem(const CvSeq* seq,int index);

//返回元素索引
Int cvSeqElemIdx(const CvSeq* seq,const void* element,CvSeqBlock** block=NULL);

//写入序列
Void cvStartAppendToSeq(CvSeq* seq,CvSeqWriter* writer);

//创建并初始化
Void cvStartWriteSeq(int seq_flags,int header_size,int elem_size,CvMemStorage* storage,CvSeqWriter* writer);

//完成写入操作
CvSeq* cvEndWriteSeq(CvSeqWriter* writer);

//初始化序列中读取过程
Void cvStartReadSeq(const CvSeq* seq,CvSeqReader* reader,int reverse=0);
时间: 2024-10-10 06:37:44

OpenCV——CvSeq动态结构序列的相关文章

opencv数据结构-MAT结构详解

1.定义 OpenCV中的C结构体有 CvMat 和 CvMatND,但后续的应用中指出 CvMat 和 CvMatND 弃用了,在C++封装中用 Mat 代替,另外旧版还有一个 IplImage,同样用 Mat 代替(可以参考博文 OpenCV中的结构体.类与Emgu.CV的对应表).矩阵 (M) 中数据元素的地址计算公式:addr(Mi0,i1,-im-1) = M.data + M.step[0] * i0 + M.step[1] * i1 + - + M.step[m-1] * im-1

使用Java开发OpenCV3程序-3.OpenCV的组件结构以及java版本的数据结构

OpenCV组件结构 关于OpenCV的组件结构“浅墨”大神给出了详细的解释,详细的参照:一览众山小:OpenCV 2.4.8 or OpenCV 2.4.9组件结构全解析 但在OpenCV3.1中还是有些变化的,在opencv/build/include/opencv2目录下有OpenCV的所有模块, 一共有这么多模块,在浅墨的文章中也做了详细的介绍,有些模块已经没有了.然后再看看java中所包含的模块,可以从opencv.jar中看到所实现的模块: 明显看到跟C++版本的少了很多模块,但是基

OpenCV中的结构体、类与Emgu.CV的对应表

OpenCv中的 C 结构 OpenCV中的 C++ 封装 Emgu.CV中的 C# 封装 OpenCV 和 Emgu.CV 中的结构罗列 谢谢阅读,有误希望指正 原文地址 Basic Structures: main data structures used in opencv. CvPoint CvPoint2D32f CvPoint2D64f CvPoint3D32f CvPoint3D64f Point_<typename _Tp> Point3_<typename _Tp>

OpenCV 视频与图片序列相互转换

我们在计算机视觉相关的实验中都需要视频与图片序列之间相互转换,在平时的实验中,经常需要将视频保存为一帧一帧的图片,以获取实验结果:另一方面,很多标准的算法测试数据库都是图片序列(文件名以帧号+图片扩展名),我们可能需要将其转换为视频,因此视频与图片之间的转换是很常见的操作.在网上找到比较好的测试程序,一方面将其封装为函数,方便调用:另一方面,视频转图片可以任意设定图片输出目录,函数会自动创建相关目录:图片序列转视频可以设定更多的参数,也就可以更好的控制,而且可以自行设定视频输出的目录,函数自动检

python--数据结构序列

什么是序列     序列是python的基本数据结构,序列中的每个元素被分配一个序号即索引,索引从0开始. 序列的两种常用类型:列表和元组. 列表与元组的区别:列表可修改,元组不能修改. 通用序列操作    1.索引:索引0指向第一个元素,索引-1指向最后一个元素. 2.程序:输入年,月(1-12),日(1-31),然后打印出相应的日期的月份名称. 代码详解:months=[]:定义一个months序列. endings=['st','nd','rd']+17*['th']\ +['st','n

自已动手写Redis【简单动态字符串序列一】

第一章 简单动态字符串 2.1 引言 字符串String是程序设计中最为常见的一种数据结构,也是最为重要的一种数据结构,Hello World!这个最为精典的程序,是绝大部份人学习一种程序设计语言的入门程序,在这个最为精典的入门程序中,Hello World!就是字符串类型,字符串可以用于软件中信息的提醒.保存等,Redis中key都是String类型的,因此了解String类型对于我们了解Redis以及动手写Redis都是非常有益的. 2.2 字符串基本概念 以上是我们最为熟悉的Hello W

OpenCv CvPoint 动态数组的创建

Hai int count=10: CvPoint *point //动态数组必须以指针的形式定义 point=new Cvpoint[count]();//创建了长度为count的动态数组 ... delete[] point;//动态数组使用完成后一定要释放储存空间

C++(opencv)读取图片序列及保存图片到指定文件夹

今天又心学到一个知识点 把它记下来 哈哈 for (int i = 1; i <= 图片数量; i++) { // sprintf读入指定路径下图片序列 sprintf_s(fileName, "D:\\VS2010\\Flow1\\Flow1\\%d.bmp", i); sprintf_s(windowName, "NO%d", i); // 按照图像文件名读取 frame = cv::imread(fileName); if (!frame.data) {

cv1.1

分水岭算法实现分割 分水岭分割方法,是一种基于拓扑理论的数学形态学的分割方法,其基本思想是把图像看作是测地学上的拓扑地貌,图像中每一点像素的灰度值表示该点的海拔高度,每一个局部极小值及其影响区域称为集水盆,而集水盆的边界则形成分水岭.分水岭的概念和形成可以通过模拟浸入过程来说明.在每一个局部极小值表面,刺穿一个小孔,然后把整个模型慢慢浸入水中,随着浸入的加深,每一个局部极小值的影响域慢慢向外扩展,在两个集水盆汇合处构筑大坝,即形成分水岭. 分水岭算法一般和区域生长法或聚类分析法相结合. 分水岭算