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. P1481 魔族密码(LIS变形)

    题目描述(题目链接:https://www.luogu.org/problem/P1481) 风之子刚走进他的考场,就…… 花花:当当当当~~偶是魅力女皇——花花!!^^(华丽出场,礼炮,鲜花) 风之 ...

  2. 「CF1039D」You Are Given a Tree

    传送门 Luogu 解题思路 整体二分. 的确是很难看出来,但是你可以发现输出的答案都是一些可以被看作是关键字处于 \([1, n]\) 的询问,而答案的范围又很显然是 \([0, n]\),这不就刚 ...

  3. NSArary自定义对象排序 NSComparator, compare

    reference from :http://mobile.51cto.com/hot-434804.htm 1.构建Person类 Person.h @interface Person : NSOb ...

  4. 【Luogu4448】 [AHOI2018初中组]球球的排列

    题意 有 \(n\) 个球球,每个球球有一个属性值 .一个合法的排列满足不存在相邻两个球球的属性值乘积是完全平方数.求合法的排列数量对 \(10^9+7\) 取膜. \(n\le 300\) (本题数 ...

  5. c++生成的动态库移到其他电脑上,动态库不能运行

    最近的一个项目中遇到了一个问题,C++的一个动态库在我自己的电脑上可以被C#程序引用,我把程序安装到其他电脑上出现了异常,提示找不到DLL,偶然间发现我安装vsc++,C#的程序就不会报错.因为这个C ...

  6. array_multisort 对关联数组进行排序的问题 PHP

    我们在php的数组操作中经常用到对数组进行排序的问题,这里说的是对关联数组进行排序需要用到函数 array_multisort . array_multisort(array_column($arr, ...

  7. Java多线程编程之守护线程

    Java的线程分为两种,一个是用户线程,一个是守护线程.守护线程守护的对象就是用户线程,当用户线程结束后,守护它的守护线程也就会结束.二者的本质基本是一样的,唯一区别在于何时结束. 用户线程:直到自己 ...

  8. 磁盘空间引起ES集群shard unassigned的处理过程

    1.问题描述 早上醒来发现手机有很多ES状态为red的告警,集群就前几天加了几个每天有十多亿记录的业务,当时估算过磁盘容量,应该是没有问题的,但是现在集群状态突然变成red了,这就有点懵逼了. 2.查 ...

  9. 苹果vs中国竞争者:瘦死的骆驼比马大?

    前不久,苹果调整2019年第一财季的营收指引,预计第一季度毛利率为38%,相关收入大约为55亿美元,全年总体营收约为840亿美元,运营开支约为87亿美元.针对2019年的运营状况,库克亲自给投资者写了 ...

  10. Day6 - B - 采花 HYSBZ - 2743

    萧芸斓是Z国的公主,平时的一大爱好是采花.今天天气晴朗,阳光明媚,公主清晨便去了皇宫中新建的花园采花 .花园足够大,容纳了n朵花,花有c种颜色(用整数1-c表示),且花是排成一排的,以便于公主采花.公 ...