1.CvMemStorage定义动态内存存储器
  内存存储器是一个用来存储诸如序列、轮廓、图形和子划分等动态增长数据结构的底层结构

2.示例
CvMemStorage *mems = cvCreateMemStorage(100);
CvMemStoragePos mempos;
cvSaveMemStoragePos(mems, &mempos);//保存地址
//cvRestoreMemStoragePos(mems, &mempos);
printf("%x %d\n", mempos.top, mempos.free_space);

CvMemStorage *mems1 = cvCreateChildMemStorage(mems);//创建子块
CvMemStoragePos mempos1;
cvSaveMemStoragePos(mems1, &mempos1);
printf("%x %d\n", mempos1.top, mempos1.free_space);

char strInfo[] = {"123123123"};
CvString str = cvMemStorageAllocString(mems, strInfo, strlen(strInfo));
printf("%s  %d\n", str.ptr, str.len);
cvReleaseMemStorage((CvMemStorage**)&mems);

3.CvSeq是所有OpenCV动态数据结构的基础。序列有两种类型:稠密序列和稀疏序列。
  (1).稠密序列都派生于CvSeq,用来代表可扩展的一维数组------向量、栈、队列和双端队列等,数据间不存在空隙,如果从序列中删除元素或将新元素插入到序列中,则此元素后的相关元素会被移动
  (2).稀疏序列都派生于CvSet,是由节点组成的序列,每个节点或者被占用空间或者是空,由flags标志指定。

4.标准的序列元素类型:
#define CV_SEQ_ELTYPE_POINT          CV_32SC2  /**< (x,y) */

#define CV_SEQ_ELTYPE_CODE           CV_8UC1   /**< freeman code: 0..7 */

#define CV_SEQ_ELTYPE_GENERIC        0

#define CV_SEQ_ELTYPE_PTR            CV_USRTYPE1

#define CV_SEQ_ELTYPE_PPOINT         CV_SEQ_ELTYPE_PTR  /**< &(x,y) */

#define CV_SEQ_ELTYPE_INDEX          CV_32SC1  /**< #(x,y) */

#define CV_SEQ_ELTYPE_GRAPH_EDGE     0  /**< &next_o, &next_d, &vtx_o, &vtx_d */

#define CV_SEQ_ELTYPE_GRAPH_VERTEX   0  /**< first_edge, &(x,y) */

#define CV_SEQ_ELTYPE_TRIAN_ATR      0  /**< vertex of the binary tree   */

#define CV_SEQ_ELTYPE_CONNECTED_COMP 0  /**< connected component  */

#define CV_SEQ_ELTYPE_POINT3D        CV_32FC3  /**< (x,y,z)  */

5.序列操作示例

CvMemStorage * mems = cvCreateMemStorage(0);
//CvSeq *seq = cvCreateSeq(CV_32FC1, sizeof(CvSeq), sizeof(float), mems);
CvSeq *seq = cvCreateSeq(CV_64FC1, sizeof(CvSeq), sizeof(double), mems);
cvSetSeqBlockSize(seq, 500);

for (double i = 500; i >= 0; i -= 1){
cvSeqPush(seq, &i);
}
double fNum[1024 * 10] = {0};
cvCvtSeqToArray(seq, fNum, CV_WHOLE_SEQ);
for (int i = 0; i < seq->total; i++){
printf("%f ", fNum[i]);
}
printf("\n");

cvSeqPop(seq);
printf("%d\n", seq->total);

double dbData = 1230;
cvSeqPushFront(seq, &dbData);
printf("%d\n", seq->total);

cvSeqPopFront(seq);
printf("%d\n", seq->total);

double fArr[] = {1,2,3,4,5,6,7,8,9,10};
cvSeqPushMulti(seq, fArr, 18, 0);
printf("%d\n", seq->total);

cvSeqInsert(seq, 5, &dbData);
printf("%d\n", seq->total);

cvSeqRemove(seq, 5);
printf("%d\n", seq->total);

for (int i = 0; i < seq->total; i++){//打印index
signed char *pT = cvGetSeqElem(seq, i);
int p = cvSeqElemIdx(seq, pT);
printf("%d\n", p);
}

CvMemStorage *mem = cvCreateMemStorage(0);
CvSeq *seq3 = cvSeqSlice(seq, CvSlice(0, seq->total), mem, seq->total);
printf("seq->total = %d\n", seq->total);
printf("seq3->total = %d\n", seq3->total);

CvSeq *seq4 = cvCloneSeq(seq);//拷贝到另外一个序列
printf("seq4->total = %d\n", seq4->total);

cvSeqRemoveSlice(seq, CvSlice(0, 1));//从序列中删除数据
printf("%d\n", seq->total);

cvSeqInsertSlice(seq, seq->total, seq3);//在序列seq中插入一个数组
cvCvtSeqToArray(seq, fNum, CV_WHOLE_SEQ);
for (int i = 0; i < seq->total; i++){
printf("%f ", fNum[i]);
}
printf("\n");

cvSeqInvert(seq);//逆序操作

//cvSeqSort(seq, CmpFunc, NULL);
CvSeqWriter seqWriter;
cvStartAppendToSeq(seq, &seqWriter);
cvStartWriteSeq(CV_64FC1, sizeof(CvSeq), sizeof(double), mem, &seqWriter);
cvEndWriteSeq(&seqWriter);

cvClearSeq(seq);
cvReleaseMemStorage(&mems);

版权声明:本文为博主原创文章,未经博主允许不得转载。

c++ opencv 动态内存的更多相关文章

  1. opencv之内存存储器——CvMemStorage与CvSeq

    1.CvMemStorage *storage=cvCreateMemStorage(block_size); 用来创建一个内存存储器,来统一管理各种动态对象的内存. 函数返回一个新创建的内存存储器指 ...

  2. 【转】Linux C动态内存泄漏追踪方法

    原文:http://www.cnblogs.com/san-fu-su/p/5737984.html C里面没有垃圾回收机制,有时候你申请了动态内存却忘记释放,这就尴尬了(你的程序扮演了强盗角色,有借 ...

  3. C++指针和动态内存分配

    指针和动态内存分配 数组与指针 数组 数组名是一个指针常量. 数组名传递数据时,传递的是地址. 数组作为函数参数时不指定第一维大小. 对象数组 A a[2] = {A(1,2)}; 执行时先调用有参数 ...

  4. SQLite剖析之动态内存分配

    SQLite通过动态内存分配来获取各种对象(例如数据库连接和SQL预处理语句)所需内存.建立数据库文件的内存Cache.保存查询结果. 1.特性    SQLite内核和它的内存分配子系统提供以下特性 ...

  5. C和指针 第十一章 动态内存分配

    声明数组时,必须指定数组长度,才可以编译,但是如果需要在运行时,指定数组的长度的话,那么就需要动态的分配内存. C函数库stdlib.h提供了两个函数,malloc和free,分别用于执行动态内存分配 ...

  6. 解决Ubuntu Server 12.04 在Hyper-v 2012 R2中不能使用动态内存的问题

    前言 全新Hyper-v 2012 R2终于开始支持在Linux的VPS中使用动态内存,可以大大优化服务器的资源分配,小弟我兴奋不已,于是抽空时间赶紧升级到 2012 R2,好好整理一番内存分配,不过 ...

  7. 动态内存分配导致Javascript性能的问题

    内存分配对性能的影响是很大的,分配内存本身需要时间,垃圾回收器回收内存也需要时间,所以应该尽量避免在堆里分配内存.不过直到最近优化HoLa cantk时,我才深刻的体会到内存分配对性能的影响,其中有一 ...

  8. C++动态内存管理之shared_ptr、unique_ptr

    C++中的动态内存管理是通过new和delete两个操作符来完成的.new操作符,为对象分配内存并调用对象所属类的构造函数,返回一个指向该对象的指针.delete调用时,销毁对象,并释放对象所在的内存 ...

  9. 【C++】动态内存与智能指针

    C++常见的内存分配方式有三种: 从静态存储区分配,这里主要是存储局部static对象,类的static成员以及定义在函数之外的变量: 从栈内存分配,这里主要是存储函数内的非static对象: 从堆内 ...

随机推荐

  1. Linux centosVMware 磁盘格式化、磁盘挂载、手动增加swap空间

    一.磁盘格式化 磁盘分区后不能直接使用,需要对每一个分区格式化,格式化其实就是安装系统文件. 命令mke2fs:不支持格式化成xfs系统文件  mkfs.ext4 == mke2fs -t ext4 ...

  2. MySQL部分语法

    MySQL 1.先进入到d盘根目录(自己安装MySQL的盘符) cd d:\2.输入net start mysql3.在d盘的根目录下输入mysql -u root -p就可以进入mysql的命令提示 ...

  3. IdentityServer4专题之三:OAuth、SSO和OpenID

    一.oauth 典型案例:如果一个用户R拥有两项服务:一项服务是图片在线存储服务A,另一个是图片在线打印服务B.由于服务A与服务B是由两家不同的服务提供商提供的,所以用户在这两家服务提供商的网站上各自 ...

  4. Linux下如何拷贝整个目录下的所有文件

    分类: Linux使用2014-01-14 13:38 1449人阅读 评论(0) 收藏 举报 如何在Linux下拷贝一个目录呢?这好像是再如意不过的问题了.比如要把/home/usera拷贝到/mn ...

  5. intel关于spark gc的优化建议

    Apache Spark由于其出色的性能.简单的接口和丰富的分析和计算库而获得了广泛的行业应用.与大数据生态系统中的许多项目一样,Spark在Java虚拟机(JVM)上运行.因为Spark可以在内存中 ...

  6. Jquery属性操作、添加类

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  7. 【QSBOJ】组成三位数

    题目描述 将1,2,…,9共9个数分成三组,分别组成三个三位数,且使这三个三位数构成1:2:3的比例,试求出所有满足条件的三个三位数. 例如:三个三位数192,384,576满足以上条件. 输出 输出 ...

  8. POJ 2386 Lake Counting 八方向棋盘搜索

    Lake Counting Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 53301   Accepted: 26062 D ...

  9. 51nod 1444:破坏道路 广度优先搜索

    1444 破坏道路 题目来源: CodeForces 基准时间限制:1.5 秒 空间限制:131072 KB 分值: 80 难度:5级算法题  收藏  取消关注 在某一个国家,那儿有n个城市,他们通过 ...

  10. HiBench成长笔记——(9) 分析源码monitor.py

    monitor.py 是主监控程序,将监控数据写入日志,并统计监控数据生成HTML统计展示页面: #!/usr/bin/env python2 # Licensed to the Apache Sof ...