您的位置:首页 > 编程语言 > C语言/C++

c++ opencv 动态内存

2015-08-05 19:43 519 查看
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);
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: