动态结构序列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=); //删除多个元素
Void cvSeqPopMulti(CvSeq* seq,void* elements,int count,int in_front=); //指定位置添加元素
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=);

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

  1. opencv数据结构-MAT结构详解

    1.定义 OpenCV中的C结构体有 CvMat 和 CvMatND,但后续的应用中指出 CvMat 和 CvMatND 弃用了,在C++封装中用 Mat 代替,另外旧版还有一个 IplImage,同 ...

  2. OpenCV学习(4)——动态结构

    学习一个新知识,无外乎学习它本身和它的工具.OpenCV提供许多内置的结构及处理函数,非常值得学习. 内存存储 在OpenCV中,内存存储器是一个可以用来存储序列.数组和图像的动态增长的数据结构.它由 ...

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

    OpenCv中的 C 结构 OpenCV中的 C++ 封装 Emgu.CV中的 C# 封装 OpenCV 和 Emgu.CV 中的结构罗列 谢谢阅读,有误希望指正 原文地址 Basic Structu ...

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

    我们在计算机视觉相关的实验中都需要视频与图片序列之间相互转换,在平时的实验中,经常需要将视频保存为一帧一帧的图片,以获取实验结果:另一方面,很多标准的算法测试数据库都是图片序列(文件名以帧号+图片扩展 ...

  5. Android 中使用 dlib+opencv 实现动态人脸检测

    1 概述 完成 Android 相机预览功能以后,在此基础上我使用 dlib 与 opencv 库做了一个关于人脸检测的 demo.该 demo 在相机预览过程中对人脸进行实时检测,并将检测到的人脸用 ...

  6. opencv——(动态)旋转图像

    #include "stdafx.h" #include <opencv2\opencv.hpp> #include <opencv\cv.h> #incl ...

  7. Android核心分析之二十七Android GDI 之SurfaceFlinger之动态结构示

           SurfaceFlinger对象建立过程示意 1 SurfaceSession的建立 客户端请求建立Surface时,首先在要与SurfaceFlinger建立一个Session,然后再 ...

  8. (转)python+opencv实现动态物体追踪

    原文链接:https://blog.csdn.net/cike14/article/details/50649811 import cv2 import numpy as np camera=cv2. ...

  9. RobHess的SIFT代码解析步骤三

    平台:win10 x64 +VS 2015专业版 +opencv-2.4.11 + gtk_-bundle_2.24.10_win32 主要参考:1.代码:RobHess的SIFT源码 2.书:王永明 ...

随机推荐

  1. 范围for语句 && 列表初始值&& 标准库函数begin和end

    范围for语句: 引入的意义:简化传统for的编写,主要用于遍历给定序列中的每个元素并对序列中的每个值执行某种操作,其语法形式是: for( 声明: 给定序列) { 执行的操作. } 其中,“给定序列 ...

  2. 常见的DoDataExchange什么意思

    该函数中的代码是由ClassWizard自动加入的.DoDataExchange只有一个参数,即一个CDataExchange对象的指针pDX.在该函数中调用了DDX函数来完成数据交换,调用DDV函数 ...

  3. Even Tree

    Link: https://www.hackerrank.com/challenges/even-tree def search(a,b): # 根据核心算法和题目要求要筛选边 seen = {} s ...

  4. 2014年总结:我的IT路

    又是一年春节时,转眼之间已经毕业4年,简单回顾一下这几年的职业生涯,希望大家提出宝贵意见. 大学时,几个同学跟着学校网络中心的老师一块做校园网上运行的小系统.偶尔协助一下老师对学校机房.校园网做一下维 ...

  5. 膜拜一个神奇的女人——Hedy Lamarr

    她演绎了首部露点电影.经历了六次婚姻.出版了首本自曝隐私的自传,还曾入室行窃过两次——在这样一个饱受争议的大环境下,她还能在60多年前提出“跳频”技术和一系列无线信号技术的全新概念,其中,“跳频”技术 ...

  6. rsyslog input 不支持变量

    input(type="imfile" File="/usr/local/apache-tomcat-7.0.55_8082/logs/localhost_access_ ...

  7. c++ 13

    一.向量 ... 10.size/resize/clear/capacity/reserve 1)向量的大小可增可减,使向量大小改变的函数包括:resize/push_back/pop_back/cl ...

  8. juicer模板引擎使用

    http://www.juicer.name/ <script src="~/Scripts/jquery-1.8.2.min.js"></script> ...

  9. chrome无法使用非官方商店扩展解决办法

        自己开发的工具性插件不想放在官方商店(当然也有可能是工作相关的工具不能放在官方商店),由于新版本的chrome不允许非官方商店的插件进行安装使用,所以出现一个头疼的问题:每次开启chrome都 ...

  10. POJ 2010 Moo University - Financial Aid 优先队列

    题意:给你c头牛,并给出每头牛的分数和花费,要求你找出其中n(n为奇数)头牛,并使这n头牛的分数的中位数尽可能大,同时这n头牛的总花费不能超过f,否则输出-1. 思路:首先对n头牛按分数进行排序,然后 ...