cvStartReadSeq初始化读取部分的状态。将指针指向seq中的起始数据快地址。
顺序读取可通过调用宏 CV_READ_SEQ_ELEM( read_elem, reader ),
逆序读取可通过调用宏CV_REV_READ_SEQ_ELEM( read_elem, reader )。
这两个宏都将序列元素读进read_elem中, 并将指针移到下一个元素。
CV_IMPL void
cvStartReadSeq( const CvSeq *seq, CvSeqReader * reader, int reverse )
{
CvSeqBlock *first_block;
CvSeqBlock *last_block;
CV_FUNCNAME( "cvStartReadSeq" );
if( reader )
{
reader->seq = 0; //初试化CvSeqReader结构体reader
reader->block = 0;
reader->ptr = reader->block_max = reader->block_min = 0;
}
__BEGIN__;
if( !seq || !reader )
CV_ERROR( CV_StsNullPtr, "" );
reader->header_size = sizeof( CvSeqReader );
reader->seq = (CvSeq*)seq; //将reader->seq指向序列seq地址
first_block = seq->first; ////将first_block指向序列seq->first地址
if( first_block ) //first_block是否以赋值
{
last_block = first_block->prev;
reader->ptr = first_block->data; //reader当前指针指向first_block数据地址
reader->prev_elem = CV_GET_LAST_ELEM( seq, last_block );
reader->delta_index = seq->first->start_index;
if( reverse ) //是正向还是反向读数据
{
char *temp = reader->ptr;
reader->ptr = reader->prev_elem;
reader->prev_elem = temp;
reader->block = last_block;
}
else
{
reader->block = first_block;
}
reader->block_min = reader->block->data;
reader->block_max = reader->block_min + reader->block->count * seq->elem_size;
}
else //如果first_block没有赋值
{
reader->delta_index = 0;
reader->block = 0;
reader->ptr = reader->prev_elem = reader->block_min = reader->block_max = 0;
}
__END__;
}