blobtrack中的几个问题

1。typedef struct DefBlobTracker
{
    CvBlob                      blob;
    CvBlobTrackPredictor*       pPredictor;
    CvBlob                      BlobPredict;
    int                         Collision;
    CvBlobSeq*                  pBlobHyp;
    float                       AverFG;
} DefBlobTracker;

 此处是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 )

        CV_MEMCPY_AUTO( ptr, element, elem_size );
    seq->first->prev->count++;
    seq->total++;
    seq->ptr = ptr + elem_size;

2。CvBlobTracker* (*create)();

此处create是一个函数指针,括号内*是指针标志,CvBlobTracker*是返回类型  ()内是参数列表。

调用的时候可以是 (*create)() 或 create(),而函数指针作为类或结构体的成员时只能是后者。

函数指针定义方式如下:

函数类型 (*指针变量名)(形参列表);

“函数类型”说明函数的返回类型,由于“()”的优先级高于“*”,所以指针变量名外的括号必不可少,且*也必不可少,后面的“形参列表”表示指针变量指向的函数所带的参数列表。

例如:

int (*f)(int x);

double (*ptr)(double x);

在定义函数指针时请注意:
   
函数指针和它指向的函数的参数个数和类型都应该是—致的;

函数指针的类型和函数的返回值类型也必须是一致的。 

原文地址:https://www.cnblogs.com/seacode/p/1881206.html