此处是BlobTrackerCC跟踪时使用的一个结构,类CvBlobTrackerCC
的成员变量m_BlobList(为CvBlobSeq类型)的初始化的大小为 m_BlobList(sizeof(DefBlobTracker))
也就是 CvBlobSeq(int BlobSize = sizeof(CvBlob)) //默认大小为sizeof(CvBlob)
{
m_pMem = cvCreateMemStorage();
m_pSeq = cvCreateSeq(0,sizeof(CvSeq),BlobSize,m_pMem); //创建序列的元素大小为BlobSize
strcpy(m_pElemFormat,"ffffi");
}
为序列添加元素
virtual CvBlob* AddBlob(CvBlob* pB, IplImage* /*pImg*/, IplImage* pImgFG = NULL )
{
assert(pImgFG); /* This tracker uses only foreground mask. */
DefBlobTracker NewB; //后面为元素结构体内成员赋值
NewB.blob = pB[0];
// CV_BLOB_ID(&NewB) = m_LastID;
NewB.pBlobHyp = new CvBlobSeq;
NewB.pPredictor = cvCreateModuleBlobTrackPredictKalman(); /* Module for position prediction. */
NewB.pPredictor->Update(pB);
NewB.pImgFG?CalcAverageMask(pB,pImgFG):0;
m_BlobList.AddBlob((CvBlob*)&NewB); //注意元素为DefBlobTracker类型的指针
}
具体实现为:AddBlob(CvBlob* pB) { cvSeqPush(m_pSeq,pB); },即:
cvSeqPush( CvSeq *seq, const void *element )
if( element )
2。CvBlobTracker* (*create)();
此处create是一个函数指针,括号内*是指针标志,CvBlobTracker*是返回类型 ()内是参数列表。
调用的时候可以是 (*create)() 或 create(),而函数指针作为类或结构体的成员时只能是后者。
函数指针定义方式如下:
函数类型 (*指针变量名)(形参列表);
“函数类型”说明函数的返回类型,由于“()”的优先级高于“*”,所以指针变量名外的括号必不可少,且*也必不可少,后面的“形参列表”表示指针变量指向的函数所带的参数列表。
例如:
int (*f)(int x);
double (*ptr)(double x);
在定义函数指针时请注意:
函数指针和它指向的函数的参数个数和类型都应该是—致的;
函数指针的类型和函数的返回值类型也必须是一致的。