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


刘、于书里面有这么一个函数: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 clearing
	
	printf("\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 void
cvClearSeq( 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 void
cvSeqPopMulti( 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__;
}


 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值