博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
c++ opencv 动态内存
阅读量:7242 次
发布时间:2019-06-29

本文共 3308 字,大约阅读时间需要 11 分钟。

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);

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

 

转载于:https://www.cnblogs.com/qq76211822/p/4711994.html

你可能感兴趣的文章
C#面试题
查看>>
kafka安装
查看>>
json、xml ---- 数据格式生成类
查看>>
LoadRunner 集群测试配置
查看>>
Exception in thread "main" javax.crypto.BadPaddingException: Given final block not properly padded
查看>>
02.Hibernate配置文件之映射配置文件
查看>>
xml 分割字符串
查看>>
OCP读书笔记(15) - 管理SQL性能调优
查看>>
微信备份方法
查看>>
16-CSS基础-清除浮动
查看>>
poj2109
查看>>
bash: /bin/cp: Argument list too long
查看>>
MYSQL数据库的主从复制
查看>>
等比数列求和
查看>>
React组件的生命周期
查看>>
NV SDK 9.5, 10 and 11
查看>>
Thinking Of Matrix
查看>>
微软商业服务器部署系列3-windows serevr 2008介绍
查看>>
使用ASM4.0实现AOP的功能,监控每个方法的执行时间
查看>>
hdoj 4004 The Frog's Games(二分)
查看>>