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. KVM——虚拟化

    KVM——虚拟化   虚拟化是指通过虚拟化技术将一台计算机虚拟为多台逻辑计算机.在一台计算机上同时运行多个逻辑计算机,每个逻辑计算机可运行不同的操作系统,并且应用程序都可以在相互独立的空间内运行而互相 ...

  2. Lognormal distribution 对数正态分布

    转载:https://blog.csdn.net/donggui8650/article/details/101556041 在概率论中,对数正态分布是一种连续概率分布,其随机变量的对数服从正态分布. ...

  3. mabatis--查询缓存

    1.mybatis提供查询缓存,用于减轻数据库压力,提高数据库性能. 2.mybatis提供一级缓存.二级缓存: 3.一级缓存是SqlSession级别的缓存.在SqlSession对象中,存在一个数 ...

  4. 解决maven项目创建过慢的问题,一直resolving dependencies...

    ##方法一: 1.在创建项目时设置其Properties (我大多在创建项目时 就解决这个问题) 创建项目的时候,在Properties属性面板中添加一项:archetypeCatalog = int ...

  5. 5.9 Nginx的配置优化

  6. java web开发_购物车功能实现

    java web开发_购物车功能实现 之前没有接触过购物车的东东,也不知道购物车应该怎么做,所以在查询了很多资料,总结一下购物车的功能实现. 查询的资料,找到三种方法: 1.用cookie实现购物车: ...

  7. VUE - vue.runtime.esm.js?6e6d:619 [Vue warn]: Do not use built-in or reserved HTML elements as component i

    <script> export default {     name:'header'       //  不要使用内置或保留的HTML元素 , 改为Header或者置或保留的HTML元素 ...

  8. 注解方式实例化Java类

    context:component-scan标签: Sprng容器通过context:component-scan标签扫描其base-package标签属性值指定的包及其子包内的所有的类并实例化被@C ...

  9. [题解] LuoguP4091 [HEOI2016/TJOI2016]求和

    传送门 首先我们来看一下怎么求\(S(m,n)\). 注意到第二类斯特林数的组合意义就是将\(m\)个不同的物品放到\(n\)个没有区别的盒子里,不允许有空盒子的方案数. 那么将\(m\)个不同的物品 ...

  10. 应用于Oculus Quest的VR头显应用

    项目需要一个VR头显项目来展示算法成果,设备为Oculus Quest一体机,基于android平台(平台要切换为android),体验了下设备效果还行,但还是有点沙窗效应.记录一下开发流程. 先贴个 ...