OpenCV学习(4)——动态结构
学习一个新知识,无外乎学习它本身和它的工具。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 |
//创建内存块,返回指向块头部的指针
CvMemStorage *cvCreateMemStorage(int block_size = 0 ); //删除内存块 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* cvCreateSeq(int seq_flags , int header_size , int elem_size , CvMenStorage* storage); //创建序列的拷贝 CvSeq* cvCloneSeq(const CvSeq* seq , CvMenStorage* storage = NULL); //序列逆序 CvSeq* cvSeqInvert(CvSeq* seq); //序列排序 CvSeq* cvSeqSort(CvSeq* seq , CvCmpFunc func , void* userdata = NULL); //序列搜索 CvSeq* cvSeqSearch(CvSeq* seq , const void* elem , CvCmpFunc func , int is_sorted , int* elem_index , void* userdata = NULL); //清空序列 CvSeq* cvClearSeq(CvSeq* seq ); //添加元素 CvSeq* cvSeqPush(CvSeq* seq , void* element = NULL); //序列pop操作 CvSeq* cvSeqPop(CvSeq* seq , void* element = NULL); //序列头部添加元素 CvSeq* cvSeqPushFront(CvSeq* seq , void* element = NULL); //删除序列的头部元素 CvSeq* cvSeqPopFront(CvSeq* seq , void* element = NULL); //添加多个元素 CvSeq* cvSeqPushMulti(CvSeq* seq , void* element = NULL , int count , int in_front = 0); //删除多个元素 CvSeq* cvSeqPopMulti(CvSeq* seq , void* element = NULL , int count , int in_front = 0); //添加元素到指定位置 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); |