学习一个新知识,无外乎学习它本身和它的工具。OpenCV提供许多内置的结构及处理函数,非常值得学习。

内存存储


在OpenCV中,内存存储器是一个可以用来存储序列、数组和图像的动态增长的数据结构。它由一系列的等大小的内存块组成,是一个线性结构。

C++ Code
1
2
3
4
5
6
7
8
 
typedef struct CvMemStorage
{
    struct CvMemBlock *bottom;
    struct CvMemBlock *top;
    struct CvMemStorage *parent;
    int block_size;
    int free_space;
} CvMemStorage;

bottom指的是列首,top指的是当前指向的块但未必是列尾。在bottom和top之间所有的块(包括bottom, 不包括top)被完全占据了空间;在top和列尾之间所有的块(包括块尾,不包括top)则是空的;而top块本身则被占据了部分空间;free_space指的是top块剩余的空字节数。

C++ Code
1
2
3
4
5
 
);

//删除内存块
void cvReleaseMemStorage(CvMemStorage **storage);

序列


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

稀疏序列都派生自CvSet,CvSet是基于CvSeq。它们都是由结点所组成的序列,每一个结点要么被占用要么是空的。这些序列作为无序的数据结构被使用,如点集、图、哈希表等。

C++ Code
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
 
);

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

//删除指定位置元素
CvSeq* cvSeqRemove(CvSeq* seq , int index );

//返回索引位置的元素的指针
char* cvGetSeqElem(const CvSeq* seq , int index);

//将数据写入序列
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中,Cvset用来代表图形、稀疏多维数组和平面子划分等。

C++ Code
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
 
//创建空的集合
CvSet* cvCreateSet(int set_flags , int header_size , int elem_size , CvMemStorage* storage);

//创建集合中的一个结点
int cvSetAdd(CvSet* set_header , CvSetElem* elem = NULL , CvSetElem** inserted_elem = NULL);

//从集合中删除元素
void cvSetRemove(CvSet* set_header , int index);

//添加元素
CvSetElem* cvSetNew(CvSet* set_header , int index);

//删除指针指向的元素
void cvSetRemoveByPtr(CvSet* set_header , void* elem);

//索引元素集合
CvSetElem* cvGetSetElem(const CvSet* set_header , int index);

//清空集合
void cvClearSet(CvSet* set_header);


C++ Code
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
 
//创建图
CvGraph* cvCreateGraph(int graph_flags , int header_size , int vtx_size , int edge_size , CvMemSorage* storage);

//插入顶点
int cvGraphAddVtx(CvGraph* graph , const CvGraphVtx* vtx = NULL , const CvGraphVtx** inserted_vtx = NULL);

//删除一个顶点
int cvGraphRemoveVtx(CvGraph* graph , int index);

//通过指针删除顶点
int cvGraphRemoveVtxByPrt(CvGraph* graph , CvGraphVtx* vtx);

//通过索引查找顶点
CvGraphVtx* cvGetGraphVtx(CvGraph* graph , int vtx_idx);

//返回相应的索引值
int cvGraphVtxIdx(CvGraph* graph , CvGraphVtx* vtx);

//通过索引添加边
int cvGraphAddEdge(CvGraph* graph , int start_idx , int end_idx ,
                   const CvGraphEdge* edge = NULL , CvGraphEdge** inserted_edge = NULL);

//通过指针添加边
int cvGraphAddEdgeByPtr(CvGraph* graph , CvGraphVtx* start_vtx , CvGraphVtx* end_vtx ,
                        const CvGraphEdge* edge = NULL , CvGraphEdge** inserted_edge = NULL);

//通过索引删除边
void cvGraphRemoveEdge(CvGraph* graph , int start_idx , int end_idx);

//通过指针删除边
void cvGraphRemoveEdgeByPtr(CvGraph* graph , CvGraphVtx* start_vtx , CvGraphVtx* end_vtx);


C++ Code
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
 
//初始化树迭代器
void cvInitTreeNodeIterator(TreeNodeIterator* tree_iterator , const void* first , int max_level);

//返回当前节点,迭代器移动到下一个节点
void* cvNextTreeNode(TreeNodeIterator* tree_iterator);

//返回当前节点,迭代器移动到前个节点
void* cvPrevTreeNode(TreeNodeIterator* tree_iterator);

//将所有节点放在序列中
CvSeq* cvTreeToNodeSeq(const void* first , int header_size , CvMemStorage* storage);

//插入节点
void cvInsertNodeToTree(void* node , void* parent , void* frame);

//删除节点
void cvRemoveNodeFromTree(void* node , void* frame);

OpenCV学习(4)——动态结构的更多相关文章

  1. 【opencv学习笔记二】opencv3.4.0组件结构说明

    在学习opencv使用之前我们先来看一下opencv有哪些组件结构.至于OpenCV组件结构的研究方法, 我们不妨管中窥豹,通过opencv安装路径下include目录里面头文件的分类存放,来一窥Op ...

  2. OpenCV——CvSeq动态结构序列

    动态结构序列CvSeq是所有OpenCV动态数据结构的基础. 分为两类: 稠密序列 稀疏序列 (1) 稠密序列都派生自CvSeq,他们用来代表可扩展的一维数组 - 向量.栈.队列和双端队列.数据间不存 ...

  3. opencv学习笔记(三)基本数据类型

    opencv学习笔记(三)基本数据类型 类:DataType 将C++数据类型转换为对应的opencv数据类型 OpenCV原始数据类型的特征模版.OpenCV的原始数据类型包括unsigned ch ...

  4. opencv学习笔记(一)IplImage, CvMat, Mat 的关系

    opencv学习笔记(一)IplImage, CvMat, Mat 的关系 opencv中常见的与图像操作有关的数据容器有Mat,cvMat和IplImage,这三种类型都可以代表和显示图像,但是,M ...

  5. (转) OpenCV学习笔记大集锦 与 图像视觉博客资源2之MIT斯坦福CMU

          首页 视界智尚 算法技术 每日技术 来打我呀 注册     OpenCV学习笔记大集锦 整理了我所了解的有关OpenCV的学习笔记.原理分析.使用例程等相关的博文.排序不分先后,随机整理的 ...

  6. OpenCV学习笔记(一)安装及运行第一个OpenCV程序

    1.下载及安装 OpenCV是一套开源免费的图形库,主要有C/C++语言编写,官网: http://opencv.org/ .在 http://opencv.org/downloads.html 可以 ...

  7. OpenCV学习笔记(27)KAZE 算法原理与源码分析(一)非线性扩散滤波

    http://blog.csdn.net/chenyusiyuan/article/details/8710462 OpenCV学习笔记(27)KAZE 算法原理与源码分析(一)非线性扩散滤波 201 ...

  8. opencv学习系列:连通域参考处理

    OpenCV里提取目标轮廓的函数是findContours,它的输入图像是一幅二值图像,输出的是每一个连通区域的轮廓点的集合:vector<vector<Point>>. 外层 ...

  9. OpenCV 学习笔记03 findContours函数

    opencv-python   4.0.1 1 函数释义 词义:发现轮廓! 从二进制图像中查找轮廓(Finds contours in a binary image):轮廓是形状分析和物体检测和识别的 ...

随机推荐

  1. 【WPF学习】第六十四章 构建基本的用户控件

    创建一个简单用户控件是开始自定义控件的好方法.本章主要介绍创建一个基本的颜色拾取器.接下来分析如何将这个控件分解成功能更强大的基于模板的控件. 创建基本的颜色拾取器很容易.然而,创建自定义颜色拾取器仍 ...

  2. Java 程序该怎么优化?(实战篇)

    面试官:出现了性能问题,该怎么去排查呢? 程序猿:接口响应那么慢,时间都花到哪里去了? 运维喵:为什么你的应用跑着跑着,CPU 就接近 100%? 分享一些真实生产问题排查故事,看看能否涨姿势,能否 ...

  3. Java哈希表入门

    Java哈希表(Hash Table) 最近做题经常用到哈希表来进行快速查询,遂记录Java是如何实现哈希表的.这里只简单讲一下利用Map和HashMap实现哈希表. 首先,什么是Map和HashMa ...

  4. .NET Core项目部署到Linux(Centos7)(七)启动和停止.NET Core项目

    目录 1.前言 2.环境和软件的准备 3.创建.NET Core API项目 4.VMware Workstation虚拟机及Centos 7安装 5.Centos 7安装.NET Core环境 6. ...

  5. Hadoop安装教程_伪分布式

    文章更新于:2020-04-09 注1:hadoop 的安装及单机配置参见:Hadoop安装教程_单机(含Java.ssh安装配置) 注2:hadoop 的完全分布式配置参见:Hadoop安装教程_分 ...

  6. python 函数--生成器

    一.生成器函数: 常规定义函数,使用yield语句而不是return语句返回结果.yield语句一次返回一个结果. 好处在于,不会一下占用很多内存生成数据. 本质:就是一个迭代器. python中提供 ...

  7. Java第三天,如何从键盘输入?匿名对象的使用方法

    在学习完Java的基础语法之后,我们还需要学会如何使用API文档,这几乎是程序员所必备的能力.对于API我们不必须去记住每一个类的功能乃至用法,只需会查就行了.但是话说回来,一些经常使用的类我们还是必 ...

  8. 7.3 java 成员变量和局部变量区别

    /* * 成员变量和局部变量的区别: * A:在类中的位置不同 * 成员变量:类中,方法外 * 局部变量:方法中或者方法声明上(形式参数) * B:在内存中的位置不同 * 成员变量:堆内存 * 局部变 ...

  9. 7.2 java 类的定义和使用

    /* * 类的定义: * 类是用来描述现实世界的事物的 * * 事物: * 属性 事物的描述信息 * 行为 事物能够做什么 * * 类是如何和事物进行对应的呢? * 类: * 成员变量 * 成员方法 ...

  10. 【FreeMarker】【程序开发】数据模型,对象包装

    [FreeMarker][程序开发]数据模型,对象包装 分类: Java.FreeMarker2014-10-25 18:49 413人阅读 评论(0) 收藏 举报 FreeMarker   目录(? ...