OpenCV之cvSeq 【一次修正】[......]

来源:互联网 发布:淘宝的淘话费 编辑:程序博客网 时间:2024/04/30 13:10


刘、于书里面有这么一个函数:Test_SeqSort()

 

其中有个call:

cvClearSeq( seq );   // Sequence clearing should be done before storage clearing

找到cxcore的htm文档:

The function cvClearSeq removes all elements from the sequence. The function does not return the memory to the storage, but this memory is reused later when new elements are added to the sequence. This function time complexity isO(1).

 

大意就是该函数将清除所有内容,但是内存空间还存在,还可以被复用,

整块代码修改如下:

void Test_SeqSort(){int * getPoint[10][2];CvMemStorage* storage = cvCreateMemStorage(0);CvSeq* seq = cvCreateSeq( CV_32SC2, sizeof(CvSeq), sizeof(CvPoint), storage );int i;    printf("\n=== Test sequence sorting ===");    for( i = 0; i < 10; i++ ){CvPoint pt;pt.x = rand() % 1000;  // 1000 以内的随机数pt.y = rand() % 1000;cvSeqPush( seq, &pt );}printf("\nOriginal point set:\n");for( i = 0; i < seq->total; i++ ){CvPoint* pt = (CvPoint*)cvGetSeqElem( seq, i );getPoint[i][0]=&pt->x;getPoint[i][1]=&pt->y;printf( "(%d,%d)\n", pt->x, pt->y);}printf("\nBefore Cleared:\n");for( i = 0; i < 10; i++ ){CvPoint* pt = (CvPoint*)(* getPoint[i]);printf( "(%d,%d)\n", pt->x, pt->y );}cvSeqSort( seq, cmp_func, 0 /* userdata is not used here */ );/* print out the sorted sequence */printf("\nAfter sorting:\n");for( i = 0; i < seq->total; i++ ){CvPoint* pt = (CvPoint*)cvGetSeqElem( seq, i );printf( "(%d,%d)\n", pt->x, pt->y );}cvClearSeq( seq );   // Sequence clearing should be done before storage clearingprintf("\nAfter Cleared:\n");for( i = 0; i < 10; i++ ){CvPoint* pt = (CvPoint*)(* getPoint[i]);printf( "(%d,%d)\n", pt->x, pt->y );}cvReleaseMemStorage( &storage );}

 

 

输出如下:

=== Test sequence sorting ===
Original point set:
(41,467)
(334,500)
(169,724)
(478,358)
(962,464)
(705,145)
(281,827)
(961,491)
(995,942)
(827,436)

Before Cleared:
(41,467)
(334,500)
(169,724)
(478,358)
(962,464)
(705,145)
(281,827)
(961,491)
(995,942)
(827,436)

After sorting:
(705,145)
(478,358)
(827,436)
(962,464)
(41,467)
(961,491)
(334,500)
(169,724)
(281,827)
(995,942)

After Cleared:
(705,145)
(478,358)
(827,436)
(962,464)
(41,467)
(961,491)
(334,500)
(169,724)
(281,827)
(995,942)

 

可见,在seq所在内存里,点还在那里,但是对于用户已经是不可见的了,因为clear函数已经将其"屏蔽"掉了

 

那么,怎么还原这些存有“点”的数据呢?

 

看了如下clear的函数原型,我想,也许您的脑海应该会有DeClear函数的思路了吧,呵呵~

 

这样看来clear函数的Time complexity =O(1).也不足为奇啦!

 贴一下clear的原型

CV_IMPL voidcvClearSeq( CvSeq *seq ){    CV_FUNCNAME( "cvClearSeq" );    __BEGIN__;    if( !seq )        CV_ERROR( CV_StsNullPtr, "" );    cvSeqPopMulti( seq, 0, seq->total );    __END__;}

 

call cvSeqPopMulti:

/* removes several elements from the end of sequence */CV_IMPL voidcvSeqPopMulti( CvSeq *seq, void *_elements, int count, int front ){    char *elements = (char *) _elements;    CV_FUNCNAME( "cvSeqPopMulti" );    __BEGIN__;    if( !seq )        CV_ERROR( CV_StsNullPtr, "NULL sequence pointer" );    if( count < 0 )        CV_ERROR( CV_StsBadSize, "number of removed elements is negative" );    count = MIN( count, seq->total );    if( !front )    {        if( elements )            elements += count * seq->elem_size;        while( count > 0 )        {            int delta = seq->first->prev->count;            delta = MIN( delta, count );            assert( delta > 0 );            seq->first->prev->count -= delta;            seq->total -= delta;            count -= delta;            delta *= seq->elem_size;            seq->ptr -= delta;            if( elements )            {                elements -= delta;                memcpy( elements, seq->ptr, delta );            }            if( seq->first->prev->count == 0 )                icvFreeSeqBlock( seq, 0 );        }    }    else    {        while( count > 0 )        {            int delta = seq->first->count;            delta = MIN( delta, count );            assert( delta > 0 );            seq->first->count -= delta;            seq->total -= delta;            count -= delta;            seq->first->start_index += delta;            delta *= seq->elem_size;            if( elements )            {                memcpy( elements, seq->first->data, delta );                elements += delta;            }            seq->first->data += delta;            if( seq->first->count == 0 )                icvFreeSeqBlock( seq, 1 );        }    }    __END__;}


 

 

原创粉丝点击