cvvidsurv.hpp
上传用户:soukeisyuu
上传日期:2022-07-03
资源大小:5943k
文件大小:41k
源码类别:

波变换

开发平台:

Visual C++

  1. /*M///////////////////////////////////////////////////////////////////////////////////////
  2. //
  3. //  IMPORTANT: READ BEFORE DOWNLOADING, COPYING, INSTALLING OR USING.
  4. //
  5. //  By downloading, copying, installing or using the software you agree to this license.
  6. //  If you do not agree to this license, do not download, install,
  7. //  copy or use the software.
  8. //
  9. //
  10. //                        Intel License Agreement
  11. //                For Open Source Computer Vision Library
  12. //
  13. // Copyright (C) 2000, Intel Corporation, all rights reserved.
  14. // Third party copyrights are property of their respective owners.
  15. //
  16. // Redistribution and use in source and binary forms, with or without modification,
  17. // are permitted provided that the following conditions are met:
  18. //
  19. //   * Redistribution's of source code must retain the above copyright notice,
  20. //     this list of conditions and the following disclaimer.
  21. //
  22. //   * Redistribution's in binary form must reproduce the above copyright notice,
  23. //     this list of conditions and the following disclaimer in the documentation
  24. //     and/or other materials provided with the distribution.
  25. //
  26. //   * The name of Intel Corporation may not be used to endorse or promote products
  27. //     derived from this software without specific prior written permission.
  28. //
  29. // This software is provided by the copyright holders and contributors "as is" and
  30. // any express or implied warranties, including, but not limited to, the implied
  31. // warranties of merchantability and fitness for a particular purpose are disclaimed.
  32. // In no event shall the Intel Corporation or contributors be liable for any direct,
  33. // indirect, incidental, special, exemplary, or consequential damages
  34. // (including, but not limited to, procurement of substitute goods or services;
  35. // loss of use, data, or profits; or business interruption) however caused
  36. // and on any theory of liability, whether in contract, strict liability,
  37. // or tort (including negligence or otherwise) arising in any way out of
  38. // the use of this software, even if advised of the possibility of such damage.
  39. //
  40. //M*/
  41. #ifndef __CVVIDEOSURVEILLANCE_H__
  42. #define __CVVIDEOSURVEILLANCE_H__
  43. /* Turn off the functionality until cvaux/src/Makefile.am gets updated: */
  44. //#if _MSC_VER >= 1200
  45. #include <stdio.h>
  46. #if _MSC_VER >= 1200 || defined __BORLANDC__
  47. #define cv_stricmp stricmp
  48. #define cv_strnicmp strnicmp
  49. #if defined WINCE
  50. #define strdup _strdup
  51. #define stricmp _stricmp
  52. #endif
  53. #elif defined __GNUC__
  54. #define cv_stricmp strcasecmp
  55. #define cv_strnicmp strncasecmp
  56. #else
  57. #error Do not know how to make case-insensitive string comparison on this platform
  58. #endif
  59. //struct DefParam;
  60. struct CvDefParam
  61. {
  62.     struct CvDefParam*    next;
  63.     char*               pName;
  64.     char*               pComment;
  65.     double*             pDouble;
  66.     double              Double;
  67.     float*              pFloat;
  68.     float               Float;
  69.     int*                pInt;
  70.     int                 Int;
  71.     char**              pStr;
  72.     char*               Str;
  73. };
  74. class CV_EXPORTS CvVSModule
  75. {
  76. private: /* Internal data: */
  77.     CvDefParam*   m_pParamList;
  78.     char*       m_pModuleTypeName;
  79.     char*       m_pModuleName;
  80.     char*       m_pNickName;
  81. protected:
  82.     int         m_Wnd;
  83. public: /* Constructor and destructor: */
  84.     CvVSModule()
  85.     {
  86.         m_pNickName = NULL;
  87.         m_pParamList = NULL;
  88.         m_pModuleTypeName = NULL;
  89.         m_pModuleName = NULL;
  90.         m_Wnd = 0;
  91.         AddParam("DebugWnd",&m_Wnd);
  92.     }
  93.     virtual ~CvVSModule()
  94.     {
  95.         CvDefParam* p = m_pParamList;
  96.         for(;p;)
  97.         {
  98.             CvDefParam* pf = p;
  99.             p=p->next;
  100.             FreeParam(&pf);
  101.         }
  102.         m_pParamList=NULL;
  103.         if(m_pModuleTypeName)free(m_pModuleTypeName);
  104.         if(m_pModuleName)free(m_pModuleName);
  105.     }
  106. private: /* Internal functions: */
  107.     void    FreeParam(CvDefParam** pp)
  108.     {
  109.         CvDefParam* p = pp[0];
  110.         if(p->Str)free(p->Str);
  111.         if(p->pName)free(p->pName);
  112.         if(p->pComment)free(p->pComment);
  113.         cvFree(pp);
  114.     }
  115.     CvDefParam* NewParam(const char* name)
  116.     {
  117.         CvDefParam* pNew = (CvDefParam*)cvAlloc(sizeof(CvDefParam));
  118.         memset(pNew,0,sizeof(CvDefParam));
  119.         pNew->pName = strdup(name);
  120.         if(m_pParamList==NULL)
  121.         {
  122.             m_pParamList = pNew;
  123.         }
  124.         else
  125.         {
  126.             CvDefParam* p = m_pParamList;
  127.             for(;p->next;p=p->next) ;
  128.             p->next = pNew;
  129.         }
  130.         return pNew;
  131.     };
  132.     CvDefParam* GetParamPtr(int index)
  133.     {
  134.         CvDefParam* p = m_pParamList;
  135.         for(;index>0 && p;index--,p=p->next) ;
  136.         return p;
  137.     }
  138.     CvDefParam* GetParamPtr(const char* name)
  139.     {
  140.         CvDefParam* p = m_pParamList;
  141.         for(;p;p=p->next)
  142.         {
  143.             if(cv_stricmp(p->pName,name)==0) break;
  144.         }
  145.         return p;
  146.     }
  147. protected: /* INTERNAL INTERFACE */
  148.     int  IsParam(const char* name)
  149.     {
  150.         return GetParamPtr(name)?1:0;
  151.     };
  152.     void AddParam(const char* name, double* pAddr)
  153.     {
  154.         NewParam(name)->pDouble = pAddr;
  155.     };
  156.     void AddParam(const char* name, float* pAddr)
  157.     {
  158.         NewParam(name)->pFloat=pAddr;
  159.     };
  160.     void AddParam(const char* name, int* pAddr)
  161.     {
  162.         NewParam(name)->pInt=pAddr;
  163.     };
  164.     void AddParam(const char* name, const char** pAddr)
  165.     {
  166.         CvDefParam* pP = NewParam(name);
  167.         const char* p = pAddr?pAddr[0]:NULL;
  168.         pP->pStr = pAddr?(char**)pAddr:&(pP->Str);
  169.         if(p)
  170.         {
  171.             pP->Str = strdup(p);
  172.             pP->pStr[0] = pP->Str;
  173.         }
  174.     };
  175.     void AddParam(const char* name)
  176.     {
  177.         CvDefParam* p = NewParam(name);
  178.         p->pDouble = &p->Double;
  179.     };
  180.     void CommentParam(const char* name, const char* pComment)
  181.     {
  182.         CvDefParam* p = GetParamPtr(name);
  183.         if(p)p->pComment = pComment ? strdup(pComment) : 0;
  184.     };
  185.     void SetTypeName(const char* name){m_pModuleTypeName = strdup(name);}
  186.     void SetModuleName(const char* name){m_pModuleName = strdup(name);}
  187.     void DelParam(const char* name)
  188.     {
  189.         CvDefParam* p = m_pParamList;
  190.         CvDefParam* pPrev = NULL;
  191.         for(;p;p=p->next)
  192.         {
  193.             if(cv_stricmp(p->pName,name)==0) break;
  194.             pPrev = p;
  195.         }
  196.         if(p)
  197.         {
  198.             if(pPrev)
  199.             {
  200.                 pPrev->next = p->next;
  201.             }
  202.             else
  203.             {
  204.                 m_pParamList = p->next;
  205.             }
  206.             FreeParam(&p);
  207.         }
  208.     }/* DelParam */
  209. public: /* EXTERNAL INTERFACE */
  210.     const char* GetParamName(int index)
  211.     {
  212.         CvDefParam* p = GetParamPtr(index);
  213.         return p?p->pName:NULL;
  214.     }
  215.     const char* GetParamComment(const char* name)
  216.     {
  217.         CvDefParam* p = GetParamPtr(name);
  218.         if(p && p->pComment) return p->pComment;
  219.         return NULL;
  220.     }
  221.     double GetParam(const char* name)
  222.     {
  223.         CvDefParam* p = GetParamPtr(name);
  224.         if(p)
  225.         {
  226.             if(p->pDouble) return p->pDouble[0];
  227.             if(p->pFloat) return p->pFloat[0];
  228.             if(p->pInt) return p->pInt[0];
  229.         }
  230.         return 0;
  231.     };
  232.     const char* GetParamStr(const char* name)
  233.     {
  234.         CvDefParam* p = GetParamPtr(name);
  235.         return p?p->Str:NULL;
  236.     }
  237.     void   SetParam(const char* name, double val)
  238.     {
  239.         CvDefParam* p = m_pParamList;
  240.         for(;p;p=p->next)
  241.         {
  242.             if(cv_stricmp(p->pName,name) != 0) continue;
  243.             if(p->pDouble)p->pDouble[0] = val;
  244.             if(p->pFloat)p->pFloat[0] = (float)val;
  245.             if(p->pInt)p->pInt[0] = cvRound(val);
  246.         }
  247.     }
  248.     void   SetParamStr(const char* name, const char* str)
  249.     {
  250.         CvDefParam* p = m_pParamList;
  251.         for(; p; p=p->next)
  252.         {
  253.             if(cv_stricmp(p->pName,name) != 0) continue;
  254.             if(p->pStr)
  255.             {
  256.                 if(p->Str)free(p->Str);
  257.                 p->Str = NULL;
  258.                 if(str)p->Str = strdup(str);
  259.                 p->pStr[0] = p->Str;
  260.             }
  261.         }
  262.         /* Convert to double and set: */
  263.         if(str) SetParam(name,atof(str));
  264.     }
  265.     void TransferParamsFromChild(CvVSModule* pM, const char* prefix = NULL)
  266.     {
  267.         char    tmp[1024];
  268.         const char*   FN = NULL;
  269.         int i;
  270.         for(i=0;;++i)
  271.         {
  272.             const char* N = pM->GetParamName(i);
  273.             if(N == NULL) break;
  274.             FN = N;
  275.             if(prefix)
  276.             {
  277.                 strcpy(tmp,prefix);
  278.                 strcat(tmp,"_");
  279.                 FN = strcat(tmp,N);
  280.             }
  281.             if(!IsParam(FN))
  282.             {
  283.                 if(pM->GetParamStr(N))
  284.                 {
  285.                     AddParam(FN,(const char**)NULL);
  286.                 }
  287.                 else
  288.                 {
  289.                     AddParam(FN);
  290.                 }
  291.             }
  292.             if(pM->GetParamStr(N))
  293.             {
  294.                 const char* val = pM->GetParamStr(N);
  295.                 SetParamStr(FN,val);
  296.             }
  297.             else
  298.             {
  299.                 double val = pM->GetParam(N);
  300.                 SetParam(FN,val);
  301.             }
  302.             CommentParam(FN, pM->GetParamComment(N));
  303.         }/* transfer next param */
  304.     }/* Transfer params */
  305.     void TransferParamsToChild(CvVSModule* pM, char* prefix = NULL)
  306.     {
  307.         char    tmp[1024];
  308.         int i;
  309.         for(i=0;;++i)
  310.         {
  311.             const char* N = pM->GetParamName(i);
  312.             if(N == NULL) break;
  313.             if(prefix)
  314.             {
  315.                 strcpy(tmp,prefix);
  316.                 strcat(tmp,"_");
  317.                 strcat(tmp,N);
  318.             }
  319.             else
  320.             {
  321.                 strcpy(tmp,N);
  322.             }
  323.             if(IsParam(tmp))
  324.             {
  325.                 if(GetParamStr(tmp))
  326.                     pM->SetParamStr(N,GetParamStr(tmp));
  327.                 else
  328.                     pM->SetParam(N,GetParam(tmp));
  329.             }
  330.         }/* Transfer next parameter */
  331.         pM->ParamUpdate();
  332.     }/* Transfer params */
  333.     virtual void ParamUpdate(){};
  334.     const char*   GetTypeName()
  335.     {
  336.         return m_pModuleTypeName;
  337.     }
  338.     int     IsModuleTypeName(const char* name)
  339.     {
  340.         return m_pModuleTypeName?(cv_stricmp(m_pModuleTypeName,name)==0):0;
  341.     }
  342.     char*   GetModuleName()
  343.     {
  344.         return m_pModuleName;
  345.     }
  346.     int     IsModuleName(const char* name)
  347.     {
  348.         return m_pModuleName?(cv_stricmp(m_pModuleName,name)==0):0;
  349.     }
  350.     void SetNickName(const char* pStr)
  351.     {
  352.         if(m_pNickName)
  353.             free(m_pNickName);
  354.         m_pNickName = NULL;
  355.         if(pStr)
  356.             m_pNickName = strdup(pStr);
  357.     }
  358.     const char* GetNickName()
  359.     {
  360.         return m_pNickName ? m_pNickName : "unknown";
  361.     }
  362.     virtual void SaveState(CvFileStorage*){};
  363.     virtual void LoadState(CvFileStorage*, CvFileNode*){};
  364.     virtual void Release() = 0;
  365. };/* CvVMModule */
  366. void inline cvWriteStruct(CvFileStorage* fs, const char* name, void* addr, const char* desc, int num=1)
  367. {
  368.     cvStartWriteStruct(fs,name,CV_NODE_SEQ|CV_NODE_FLOW);
  369.     cvWriteRawData(fs,addr,num,desc);
  370.     cvEndWriteStruct(fs);
  371. }
  372. void inline cvReadStructByName(CvFileStorage* fs, CvFileNode* node, const char* name, void* addr, const char* desc)
  373. {
  374.     CvFileNode* pSeqNode = cvGetFileNodeByName(fs, node, name);
  375.     if(pSeqNode==NULL)
  376.     {
  377.         printf("WARNING!!! Can't read structure %sn",name);
  378.     }
  379.     else
  380.     {
  381.         if(CV_NODE_IS_SEQ(pSeqNode->tag))
  382.         {
  383.             cvReadRawData( fs, pSeqNode, addr, desc );
  384.         }
  385.         else
  386.         {
  387.             printf("WARNING!!! Structure %s is not sequence and can not be readn",name);
  388.         }
  389.     }
  390. }
  391. /* FOREGROUND DETECTOR INTERFACE */
  392. class CV_EXPORTS CvFGDetector: public CvVSModule
  393. {
  394. public:
  395. CvFGDetector(){SetTypeName("FGDetector");};
  396.     virtual IplImage* GetMask() = 0;
  397.     /* Process current image: */
  398.     virtual void    Process(IplImage* pImg) = 0;
  399.     /* Release foreground detector: */
  400.     virtual void    Release() = 0;
  401. };
  402. inline void cvReleaseFGDetector(CvFGDetector** ppT )
  403. {
  404.     ppT[0]->Release();
  405.     ppT[0] = 0;
  406. }
  407. /* FOREGROUND DETECTOR INTERFACE */
  408. CV_EXPORTS CvFGDetector* cvCreateFGDetectorBase(int type, void *param);
  409. /* BLOB STRUCTURE*/
  410. struct CvBlob
  411. {
  412.     float   x,y; /* blob position   */
  413.     float   w,h; /* blob sizes      */
  414.     int     ID;  /* blob ID         */
  415. };
  416. inline CvBlob cvBlob(float x,float y, float w, float h)
  417. {
  418.     CvBlob B = {x,y,w,h,0};
  419.     return B;
  420. }
  421. #define CV_BLOB_MINW 5
  422. #define CV_BLOB_MINH 5
  423. #define CV_BLOB_ID(pB) (((CvBlob*)(pB))->ID)
  424. #define CV_BLOB_CENTER(pB) cvPoint2D32f(((CvBlob*)(pB))->x,((CvBlob*)(pB))->y)
  425. #define CV_BLOB_X(pB) (((CvBlob*)(pB))->x)
  426. #define CV_BLOB_Y(pB) (((CvBlob*)(pB))->y)
  427. #define CV_BLOB_WX(pB) (((CvBlob*)(pB))->w)
  428. #define CV_BLOB_WY(pB) (((CvBlob*)(pB))->h)
  429. #define CV_BLOB_RX(pB) (0.5f*CV_BLOB_WX(pB))
  430. #define CV_BLOB_RY(pB) (0.5f*CV_BLOB_WY(pB))
  431. #define CV_BLOB_RECT(pB) cvRect(cvRound(((CvBlob*)(pB))->x-CV_BLOB_RX(pB)),cvRound(((CvBlob*)(pB))->y-CV_BLOB_RY(pB)),cvRound(CV_BLOB_WX(pB)),cvRound(CV_BLOB_WY(pB)))
  432. /* END BLOB STRUCTURE*/
  433. /* simple BLOBLIST */
  434. class CV_EXPORTS CvBlobSeq
  435. {
  436. public:
  437.     CvBlobSeq(int BlobSize = sizeof(CvBlob))
  438.     {
  439.         m_pMem = cvCreateMemStorage();
  440.         m_pSeq = cvCreateSeq(0,sizeof(CvSeq),BlobSize,m_pMem);
  441.         strcpy(m_pElemFormat,"ffffi");
  442.     }
  443.     virtual ~CvBlobSeq()
  444.     {
  445.         cvReleaseMemStorage(&m_pMem);
  446.     };
  447.     virtual CvBlob* GetBlob(int BlobIndex)
  448.     {
  449.         return (CvBlob*)cvGetSeqElem(m_pSeq,BlobIndex);
  450.     };
  451.     virtual CvBlob* GetBlobByID(int BlobID)
  452.     {
  453.         int i;
  454.         for(i=0; i<m_pSeq->total; ++i)
  455.             if(BlobID == CV_BLOB_ID(GetBlob(i)))
  456.                 return GetBlob(i);
  457.         return NULL;
  458.     };
  459.     virtual void DelBlob(int BlobIndex)
  460.     {
  461.         cvSeqRemove(m_pSeq,BlobIndex);
  462.     };
  463.     virtual void DelBlobByID(int BlobID)
  464.     {
  465.         int i;
  466.         for(i=0; i<m_pSeq->total; ++i)
  467.         {
  468.             if(BlobID == CV_BLOB_ID(GetBlob(i)))
  469.             {
  470.                 DelBlob(i);
  471.                 return;
  472.             }
  473.         }
  474.     };
  475.     virtual void Clear()
  476.     {
  477.         cvClearSeq(m_pSeq);
  478.     };
  479.     virtual void AddBlob(CvBlob* pB)
  480.     {
  481.         cvSeqPush(m_pSeq,pB);
  482.     };
  483.     virtual int GetBlobNum()
  484.     {
  485.         return m_pSeq->total;
  486.     };
  487.     virtual void Write(CvFileStorage* fs, const char* name)
  488.     {
  489.         const char*  attr[] = {"dt",m_pElemFormat,NULL};
  490.         if(fs)
  491.         {
  492.             cvWrite(fs,name,m_pSeq,cvAttrList(attr,NULL));
  493.         }
  494.     }
  495.     virtual void Load(CvFileStorage* fs, CvFileNode* node)
  496.     {
  497.         if(fs==NULL) return;
  498.         CvSeq* pSeq = (CvSeq*)cvRead(fs, node);
  499.         if(pSeq)
  500.         {
  501.             int i;
  502.             cvClearSeq(m_pSeq);
  503.             for(i=0;i<pSeq->total;++i)
  504.             {
  505.                 void* pB = cvGetSeqElem( pSeq, i );
  506.                 cvSeqPush( m_pSeq, pB );
  507.             }
  508.         }
  509.     }
  510.     void AddFormat(const char* str){strcat(m_pElemFormat,str);}
  511. protected:
  512.     CvMemStorage*   m_pMem;
  513.     CvSeq*          m_pSeq;
  514.     char            m_pElemFormat[1024];
  515. };
  516. /* simple BLOBLIST */
  517. /* simple TRACKLIST */
  518. struct CvBlobTrack
  519. {
  520.     int         TrackID;
  521.     int         StartFrame;
  522.     CvBlobSeq*  pBlobSeq;
  523. };
  524. class CV_EXPORTS CvBlobTrackSeq
  525. {
  526. public:
  527.     CvBlobTrackSeq(int TrackSize = sizeof(CvBlobTrack))
  528.     {
  529.         m_pMem = cvCreateMemStorage();
  530.         m_pSeq = cvCreateSeq(0,sizeof(CvSeq),TrackSize,m_pMem);
  531.     }
  532.     virtual ~CvBlobTrackSeq()
  533.     {
  534.         Clear();
  535.         cvReleaseMemStorage(&m_pMem);
  536.     };
  537.     virtual CvBlobTrack* GetBlobTrack(int TrackIndex)
  538.     {
  539.         return (CvBlobTrack*)cvGetSeqElem(m_pSeq,TrackIndex);
  540.     };
  541.     virtual CvBlobTrack* GetBlobTrackByID(int TrackID)
  542.     {
  543.         int i;
  544.         for(i=0; i<m_pSeq->total; ++i)
  545.         {
  546.             CvBlobTrack* pP = GetBlobTrack(i);
  547.             if(pP && pP->TrackID == TrackID)
  548.                 return pP;
  549.         }
  550.         return NULL;
  551.     };
  552.     virtual void DelBlobTrack(int TrackIndex)
  553.     {
  554.         CvBlobTrack* pP = GetBlobTrack(TrackIndex);
  555.         if(pP && pP->pBlobSeq) delete pP->pBlobSeq;
  556.         cvSeqRemove(m_pSeq,TrackIndex);
  557.     };
  558.     virtual void DelBlobTrackByID(int TrackID)
  559.     {
  560.         int i;
  561.         for(i=0; i<m_pSeq->total; ++i)
  562.         {
  563.             CvBlobTrack* pP = GetBlobTrack(i);
  564.             if(TrackID == pP->TrackID)
  565.             {
  566.                 DelBlobTrack(i);
  567.                 return;
  568.             }
  569.         }
  570.     };
  571.     virtual void Clear()
  572.     {
  573.         int i;
  574.         for(i=GetBlobTrackNum();i>0;i--)
  575.         {
  576.             DelBlobTrack(i-1);
  577.         }
  578.         cvClearSeq(m_pSeq);
  579.     };
  580.     virtual void AddBlobTrack(int TrackID, int StartFrame = 0)
  581.     {
  582.         CvBlobTrack N;
  583.         N.TrackID = TrackID;
  584.         N.StartFrame = StartFrame;
  585.         N.pBlobSeq = new CvBlobSeq;
  586.         cvSeqPush(m_pSeq,&N);
  587.     };
  588.     virtual int GetBlobTrackNum()
  589.     {
  590.         return m_pSeq->total;
  591.     };
  592. protected:
  593.     CvMemStorage*   m_pMem;
  594.     CvSeq*          m_pSeq;
  595. };
  596. /* simple TRACKLIST */
  597. /* BLOB DETECTOR INTERFACE */
  598. class CV_EXPORTS CvBlobDetector: public CvVSModule
  599. {
  600. public:
  601. CvBlobDetector(){SetTypeName("BlobDetector");};
  602.     /* Try to detect new blob entrance based on foreground mask. */
  603.     /* pFGMask - image of foreground mask */
  604.     /* pNewBlob - pointer to CvBlob structure which will be filled if new blob entrance detected */
  605.     /* pOldBlobList - pointer to blob list which already exist on image */
  606.     virtual int DetectNewBlob(IplImage* pImg, IplImage* pImgFG, CvBlobSeq* pNewBlobList, CvBlobSeq* pOldBlobList) = 0;
  607.     /* release blob detector */
  608.     virtual void Release()=0;
  609. };
  610. /* Release any blob detector: */
  611. inline void cvReleaseBlobDetector(CvBlobDetector** ppBD)
  612. {
  613.     ppBD[0]->Release();
  614.     ppBD[0] = NULL;
  615. }
  616. /* END BLOB DETECTOR INTERFACE */
  617. /* Declarations of constructors of implemented modules: */
  618. CV_EXPORTS CvBlobDetector* cvCreateBlobDetectorSimple();
  619. CV_EXPORTS CvBlobDetector* cvCreateBlobDetectorCC();
  620. struct CV_EXPORTS CvDetectedBlob : public CvBlob
  621. {
  622.     float response;
  623. };
  624. CV_INLINE CvDetectedBlob cvDetectedBlob( float x, float y, float w, float h, int ID = 0, float response = 0.0F )
  625. {
  626.     CvDetectedBlob b;
  627.     b.x = x; b.y = y; b.w = w; b.h = h; b.ID = ID; b.response = response;
  628.     return b;
  629. }
  630. class CV_EXPORTS CvObjectDetector
  631. {
  632. public:
  633.     CvObjectDetector( const char* /*detector_file_name*/ = 0 ) {};
  634.     ~CvObjectDetector() {};
  635.     /*
  636.      * Release the current detector and load new detector from file
  637.      * (if detector_file_name is not 0)
  638.      * Return true on success:
  639.      */
  640.     bool Load( const char* /*detector_file_name*/ = 0 ) { return false; }
  641.     /* Return min detector window size: */
  642.     CvSize GetMinWindowSize() const { return cvSize(0,0); }
  643.     /* Return max border: */
  644.     int GetMaxBorderSize() const { return 0; }
  645.     /*
  646.      * Detect the object on the image and push the detected
  647.      * blobs into <detected_blob_seq> which must be the sequence of <CvDetectedBlob>s
  648.      */
  649.     void Detect( const CvArr* /*img*/, /* out */ CvBlobSeq* /*detected_blob_seq*/ = 0 ) {};
  650. protected:
  651.     class CvObjectDetectorImpl* impl;
  652. };
  653. CV_INLINE CvRect cvRectIntersection( const CvRect r1, const CvRect r2 )
  654. {
  655.     CvRect r = cvRect( MAX(r1.x, r2.x), MAX(r1.y, r2.y), 0, 0 );
  656.     r.width  = MIN(r1.x + r1.width, r2.x + r2.width) - r.x;
  657.     r.height = MIN(r1.y + r1.height, r2.y + r2.height) - r.y;
  658.     return r;
  659. }
  660. /*
  661.  * CvImageDrawer
  662.  *
  663.  * Draw on an image the specified ROIs from the source image and
  664.  * given blobs as ellipses or rectangles:
  665.  */
  666. struct CvDrawShape
  667. {
  668.     enum {RECT, ELLIPSE} shape;
  669.     CvScalar color;
  670. };
  671. /*extern const CvDrawShape icv_shape[] =
  672. {
  673.     { CvDrawShape::ELLIPSE, CV_RGB(255,0,0) },
  674.     { CvDrawShape::ELLIPSE, CV_RGB(0,255,0) },
  675.     { CvDrawShape::ELLIPSE, CV_RGB(0,0,255) },
  676.     { CvDrawShape::ELLIPSE, CV_RGB(255,255,0) },
  677.     { CvDrawShape::ELLIPSE, CV_RGB(0,255,255) },
  678.     { CvDrawShape::ELLIPSE, CV_RGB(255,0,255) }
  679. };*/
  680. class CV_EXPORTS CvImageDrawer
  681. {
  682. public:
  683.     CvImageDrawer() : m_image(0) {}
  684.     ~CvImageDrawer() { cvReleaseImage( &m_image ); }
  685.     void SetShapes( const CvDrawShape* shapes, int num );
  686.     /* <blob_seq> must be the sequence of <CvDetectedBlob>s */
  687.     IplImage* Draw( const CvArr* src, CvBlobSeq* blob_seq = 0, const CvSeq* roi_seq = 0 );
  688.     IplImage* GetImage() { return m_image; }
  689. protected:
  690.     //static const int MAX_SHAPES = sizeof(icv_shape) / sizeof(icv_shape[0]);;
  691.     IplImage* m_image;
  692.     CvDrawShape m_shape[16];
  693. };
  694. /* Trajectory generation module: */
  695. class CV_EXPORTS CvBlobTrackGen: public CvVSModule
  696. {
  697. public:
  698. CvBlobTrackGen(){SetTypeName("BlobTrackGen");};
  699.     virtual void    SetFileName(char* pFileName) = 0;
  700.     virtual void    AddBlob(CvBlob* pBlob) = 0;
  701.     virtual void    Process(IplImage* pImg = NULL, IplImage* pFG = NULL) = 0;
  702.     virtual void    Release() = 0;
  703. };
  704. inline void cvReleaseBlobTrackGen(CvBlobTrackGen** pBTGen)
  705. {
  706.     if(*pBTGen)(*pBTGen)->Release();
  707.     *pBTGen = 0;
  708. }
  709. /* Declarations of constructors of implemented modules: */
  710. CV_EXPORTS CvBlobTrackGen* cvCreateModuleBlobTrackGen1();
  711. CV_EXPORTS CvBlobTrackGen* cvCreateModuleBlobTrackGenYML();
  712. /* BLOB TRACKER INTERFACE */
  713. class CV_EXPORTS CvBlobTracker: public CvVSModule
  714. {
  715. public:
  716.     CvBlobTracker(){SetTypeName("BlobTracker");};
  717.     /* Add new blob to track it and assign to this blob personal ID */
  718.     /* pBlob - pointer to structure with blob parameters (ID is ignored)*/
  719.     /* pImg - current image */
  720.     /* pImgFG - current foreground mask */
  721.     /* Return pointer to new added blob: */
  722.     virtual CvBlob* AddBlob(CvBlob* pBlob, IplImage* pImg, IplImage* pImgFG = NULL ) = 0;
  723.     /* Return number of currently tracked blobs: */
  724.     virtual int     GetBlobNum() = 0;
  725.     /* Return pointer to specified by index blob: */
  726.     virtual CvBlob* GetBlob(int BlobIndex) = 0;
  727.     /* Delete blob by its index: */
  728.     virtual void    DelBlob(int BlobIndex) = 0;
  729.     /* Process current image and track all existed blobs: */
  730.     virtual void    Process(IplImage* pImg, IplImage* pImgFG = NULL) = 0;
  731.     /* Release blob tracker: */
  732.     virtual void    Release() = 0;
  733.     /* Process one blob (for multi hypothesis tracing): */
  734.     virtual void ProcessBlob(int BlobIndex, CvBlob* pBlob, IplImage* /*pImg*/, IplImage* /*pImgFG*/ = NULL)
  735.     {
  736.         CvBlob* pB;
  737.         int ID = 0;
  738.         assert(pBlob);
  739.         //pBlob->ID;
  740.         pB = GetBlob(BlobIndex);
  741.         if(pB)
  742.             pBlob[0] = pB[0];
  743.         pBlob->ID = ID;
  744.     };
  745.     /* Get confidence/wieght/probability (0-1) for blob: */
  746.     virtual double  GetConfidence(int /*BlobIndex*/, CvBlob* /*pBlob*/, IplImage* /*pImg*/, IplImage* /*pImgFG*/ = NULL)
  747.     {
  748.         return 1;
  749.     };
  750.     virtual double GetConfidenceList(CvBlobSeq* pBlobList, IplImage* pImg, IplImage* pImgFG = NULL)
  751.     {
  752.         int     b,bN = pBlobList->GetBlobNum();
  753.         double  W = 1;
  754.         for(b=0;b<bN;++b)
  755.         {
  756.             CvBlob* pB = pBlobList->GetBlob(b);
  757.             int     BI = GetBlobIndexByID(pB->ID);
  758.             W *= GetConfidence(BI,pB,pImg,pImgFG);
  759.         }
  760.         return W;
  761.     };
  762.     virtual void UpdateBlob(int /*BlobIndex*/, CvBlob* /*pBlob*/, IplImage* /*pImg*/, IplImage* /*pImgFG*/ = NULL){};
  763.     /* Update all blob models: */
  764.     virtual void Update(IplImage* pImg, IplImage* pImgFG = NULL)
  765.     {
  766.         int i;
  767.         for(i=GetBlobNum();i>0;i--)
  768.         {
  769.             CvBlob* pB=GetBlob(i-1);
  770.             UpdateBlob(i-1, pB, pImg, pImgFG);
  771.         }
  772.     };
  773.     /* Return pointer to blob by its unique ID: */
  774.     virtual int     GetBlobIndexByID(int BlobID)
  775.     {
  776.         int i;
  777.         for(i=GetBlobNum();i>0;i--)
  778.         {
  779.             CvBlob* pB=GetBlob(i-1);
  780.             if(CV_BLOB_ID(pB) == BlobID) return i-1;
  781.         }
  782.         return -1;
  783.     };
  784.     /* Return pointer to blob by its unique ID: */
  785.     virtual CvBlob* GetBlobByID(int BlobID){return GetBlob(GetBlobIndexByID(BlobID));};
  786.     /* Delete blob by its ID: */
  787.     virtual void    DelBlobByID(int BlobID){DelBlob(GetBlobIndexByID(BlobID));};
  788.     /* Set new parameters for specified (by index) blob: */
  789.     virtual void    SetBlob(int /*BlobIndex*/, CvBlob* /*pBlob*/){};
  790.     /* Set new parameters for specified (by ID) blob: */
  791.     virtual void    SetBlobByID(int BlobID, CvBlob* pBlob)
  792.     {
  793.         SetBlob(GetBlobIndexByID(BlobID),pBlob);
  794.     };
  795.     /*  ===============  MULTI HYPOTHESIS INTERFACE ==================  */
  796.     /* Return number of position hyposetis of currently tracked blob: */
  797.     virtual int     GetBlobHypNum(int /*BlobIdx*/){return 1;};
  798.     /* Return pointer to specified blob hypothesis by index blob: */
  799.     virtual CvBlob* GetBlobHyp(int BlobIndex, int /*hypothesis*/){return GetBlob(BlobIndex);};
  800.     /* Set new parameters for specified (by index) blob hyp
  801.      * (can be called several times for each hyp ):
  802.      */
  803.     virtual void    SetBlobHyp(int /*BlobIndex*/, CvBlob* /*pBlob*/){};
  804. };
  805. inline void cvReleaseBlobTracker(CvBlobTracker**ppT )
  806. {
  807.     ppT[0]->Release();
  808.     ppT[0] = 0;
  809. }
  810. /* BLOB TRACKER INTERFACE */
  811. /*BLOB TRACKER ONE INTERFACE */
  812. class CV_EXPORTS CvBlobTrackerOne:public CvVSModule
  813. {
  814. public:
  815.     virtual void Init(CvBlob* pBlobInit, IplImage* pImg, IplImage* pImgFG = NULL) = 0;
  816.     virtual CvBlob* Process(CvBlob* pBlobPrev, IplImage* pImg, IplImage* pImgFG = NULL) = 0;
  817.     virtual void Release() =  0;
  818.     /* Non-required methods: */
  819.     virtual void SkipProcess(CvBlob* /*pBlobPrev*/, IplImage* /*pImg*/, IplImage* /*pImgFG*/ = NULL){};
  820.     virtual void Update(CvBlob* /*pBlob*/, IplImage* /*pImg*/, IplImage* /*pImgFG*/ = NULL){};
  821.     virtual void SetCollision(int /*CollisionFlag*/){}; /* call in case of blob collision situation*/
  822.     virtual double GetConfidence(CvBlob* /*pBlob*/, IplImage* /*pImg*/,
  823.                                  IplImage* /*pImgFG*/ = NULL, IplImage* /*pImgUnusedReg*/ = NULL)
  824.     {
  825.         return 1;
  826.     };
  827. };
  828. inline void cvReleaseBlobTrackerOne(CvBlobTrackerOne **ppT )
  829. {
  830.     ppT[0]->Release();
  831.     ppT[0] = 0;
  832. }
  833. CV_EXPORTS CvBlobTracker* cvCreateBlobTrackerList(CvBlobTrackerOne* (*create)());
  834. /*BLOB TRACKER ONE INTERFACE */
  835. /* Declarations of constructors of implemented modules: */
  836. /* Some declarations for specific MeanShift tracker: */
  837. #define PROFILE_EPANECHNIKOV    0
  838. #define PROFILE_DOG             1
  839. struct CvBlobTrackerParamMS
  840. {
  841.     int     noOfSigBits;
  842.     int     appearance_profile;
  843.     int     meanshift_profile;
  844.     float   sigma;
  845. };
  846. CV_EXPORTS CvBlobTracker* cvCreateBlobTrackerMS1(CvBlobTrackerParamMS* param);
  847. CV_EXPORTS CvBlobTracker* cvCreateBlobTrackerMS2(CvBlobTrackerParamMS* param);
  848. CV_EXPORTS CvBlobTracker* cvCreateBlobTrackerMS1ByList();
  849. /* Some declarations for specific Likelihood tracker: */
  850. struct CvBlobTrackerParamLH
  851. {
  852.     int     HistType; /* see Prob.h */
  853.     int     ScaleAfter;
  854. };
  855. /* Without scale optimization: */
  856. CV_EXPORTS CvBlobTracker* cvCreateBlobTrackerLHR(CvBlobTrackerParamLH* /*param*/ = NULL);
  857. /* With scale optimization: */
  858. CV_EXPORTS CvBlobTracker* cvCreateBlobTrackerLHRS(CvBlobTrackerParamLH* /*param*/ = NULL);
  859. /* Simple blob tracker based on connected component tracking: */
  860. CV_EXPORTS CvBlobTracker* cvCreateBlobTrackerCC();
  861. /* Connected component tracking and mean-shift particle filter collion-resolver: */
  862. CV_EXPORTS CvBlobTracker* cvCreateBlobTrackerCCMSPF();
  863. /* Blob tracker that integrates meanshift and connected components: */
  864. CV_EXPORTS CvBlobTracker* cvCreateBlobTrackerMSFG();
  865. CV_EXPORTS CvBlobTracker* cvCreateBlobTrackerMSFGS();
  866. /* Meanshift without connected-components */
  867. CV_EXPORTS CvBlobTracker* cvCreateBlobTrackerMS();
  868. /* Particle filtering via Bhattacharya coefficient, which        */
  869. /* is roughly the dot-product of two probability densities.      */
  870. /* See: Real-Time Tracking of Non-Rigid Objects using Mean Shift */
  871. /*      Comanicius, Ramesh, Meer, 2000, 8p                       */
  872. /*      http://citeseer.ist.psu.edu/321441.html                  */
  873. CV_EXPORTS CvBlobTracker* cvCreateBlobTrackerMSPF();
  874. /* =========== tracker integrators trackers =============*/
  875. /* Integrator based on Particle Filtering method: */
  876. //CV_EXPORTS CvBlobTracker* cvCreateBlobTrackerIPF();
  877. /* Rule based integrator: */
  878. //CV_EXPORTS CvBlobTracker* cvCreateBlobTrackerIRB();
  879. /* Integrator based on data fusion using particle filtering: */
  880. //CV_EXPORTS CvBlobTracker* cvCreateBlobTrackerIPFDF();
  881. /* Trajectory postprocessing module: */
  882. class CV_EXPORTS CvBlobTrackPostProc: public CvVSModule
  883. {
  884. public:
  885. CvBlobTrackPostProc(){SetTypeName("BlobTrackPostProc");};
  886.     virtual void    AddBlob(CvBlob* pBlob) = 0;
  887.     virtual void    Process() = 0;
  888.     virtual int     GetBlobNum() = 0;
  889.     virtual CvBlob* GetBlob(int index) = 0;
  890.     virtual void    Release() = 0;
  891.     /* Additional functionality: */
  892.     virtual CvBlob* GetBlobByID(int BlobID)
  893.     {
  894.         int i;
  895.         for(i=GetBlobNum();i>0;i--)
  896.         {
  897.             CvBlob* pB=GetBlob(i-1);
  898.             if(pB->ID==BlobID) return pB;
  899.         }
  900.         return NULL;
  901.     };
  902. };
  903. inline void cvReleaseBlobTrackPostProc(CvBlobTrackPostProc** pBTPP)
  904. {
  905.     if(pBTPP == NULL) return;
  906.     if(*pBTPP)(*pBTPP)->Release();
  907.     *pBTPP = 0;
  908. }
  909. /* Trajectory generation module: */
  910. class CV_EXPORTS CvBlobTrackPostProcOne: public CvVSModule
  911. {
  912. public:
  913. CvBlobTrackPostProcOne(){SetTypeName("BlobTrackPostOne");};
  914.     virtual CvBlob* Process(CvBlob* pBlob) = 0;
  915.     virtual void    Release() = 0;
  916. };
  917. /* Create blob tracking post processing module based on simle module: */
  918. CV_EXPORTS CvBlobTrackPostProc* cvCreateBlobTrackPostProcList(CvBlobTrackPostProcOne* (*create)());
  919. /* Declarations of constructors of implemented modules: */
  920. CV_EXPORTS CvBlobTrackPostProc* cvCreateModuleBlobTrackPostProcKalman();
  921. CV_EXPORTS CvBlobTrackPostProc* cvCreateModuleBlobTrackPostProcTimeAverRect();
  922. CV_EXPORTS CvBlobTrackPostProc* cvCreateModuleBlobTrackPostProcTimeAverExp();
  923. /* PREDICTORS */
  924. /* blob PREDICTOR */
  925. class CvBlobTrackPredictor: public CvVSModule
  926. {
  927. public:
  928. CvBlobTrackPredictor(){SetTypeName("BlobTrackPredictor");};
  929.     virtual CvBlob* Predict() = 0;
  930.     virtual void    Update(CvBlob* pBlob) = 0;
  931.     virtual void    Release() = 0;
  932. };
  933. CV_EXPORTS CvBlobTrackPredictor* cvCreateModuleBlobTrackPredictKalman();
  934. /* Trajectory analyser module: */
  935. class CV_EXPORTS CvBlobTrackAnalysis: public CvVSModule
  936. {
  937. public:
  938. CvBlobTrackAnalysis(){SetTypeName("BlobTrackAnalysis");};
  939.     virtual void    AddBlob(CvBlob* pBlob) = 0;
  940.     virtual void    Process(IplImage* pImg, IplImage* pFG) = 0;
  941.     virtual float   GetState(int BlobID) = 0;
  942.     /* return 0 if trajectory is normal
  943.        return >0 if trajectory abnormal */
  944.     virtual const char*   GetStateDesc(int /*BlobID*/){return NULL;};
  945.     virtual void    SetFileName(char* /*DataBaseName*/){};
  946.     virtual void    Release() = 0;
  947. };
  948. inline void cvReleaseBlobTrackAnalysis(CvBlobTrackAnalysis** pBTPP)
  949. {
  950.     if(pBTPP == NULL) return;
  951.     if(*pBTPP)(*pBTPP)->Release();
  952.     *pBTPP = 0;
  953. }
  954. /* Feature-vector generation module: */
  955. class CV_EXPORTS CvBlobTrackFVGen : public CvVSModule
  956. {
  957. public:
  958. CvBlobTrackFVGen(){SetTypeName("BlobTrackFVGen");};
  959.     virtual void    AddBlob(CvBlob* pBlob) = 0;
  960.     virtual void    Process(IplImage* pImg, IplImage* pFG) = 0;
  961.     virtual void    Release() = 0;
  962.     virtual int     GetFVSize() = 0;
  963.     virtual int     GetFVNum() = 0;
  964.     virtual float*  GetFV(int index, int* pFVID) = 0; /* Returns pointer to FV, if return 0 then FV not created */
  965.     virtual float*  GetFVVar(){return NULL;}; /* Returns pointer to array of variation of values of FV, if returns 0 then FVVar does not exist. */
  966.     virtual float*  GetFVMin() = 0; /* Returns pointer to array of minimal values of FV, if returns 0 then FVrange does not exist */
  967.     virtual float*  GetFVMax() = 0; /* Returns pointer to array of maximal values of FV, if returns 0 then FVrange does not exist */
  968. };
  969. /* Trajectory Analyser module: */
  970. class CV_EXPORTS CvBlobTrackAnalysisOne
  971. {
  972. public:
  973.     virtual ~CvBlobTrackAnalysisOne() {};
  974.     virtual int     Process(CvBlob* pBlob, IplImage* pImg, IplImage* pFG) = 0;
  975.     /* return 0 if trajectory is normal
  976.        return >0 if trajectory abnormal */
  977.     virtual void    Release() = 0;
  978. };
  979. /* Create blob tracking post processing module based on simle module: */
  980. CV_EXPORTS CvBlobTrackAnalysis* cvCreateBlobTrackAnalysisList(CvBlobTrackAnalysisOne* (*create)());
  981. /* Declarations of constructors of implemented modules: */
  982. /* Based on histogram analysis of 2D FV (x,y): */
  983. CV_EXPORTS CvBlobTrackAnalysis* cvCreateModuleBlobTrackAnalysisHistP();
  984. /* Based on histogram analysis of 4D FV (x,y,vx,vy): */
  985. CV_EXPORTS CvBlobTrackAnalysis* cvCreateModuleBlobTrackAnalysisHistPV();
  986. /* Based on histogram analysis of 5D FV (x,y,vx,vy,state): */
  987. CV_EXPORTS CvBlobTrackAnalysis* cvCreateModuleBlobTrackAnalysisHistPVS();
  988. /* Based on histogram analysis of 4D FV (startpos,stoppos): */
  989. CV_EXPORTS CvBlobTrackAnalysis* cvCreateModuleBlobTrackAnalysisHistSS();
  990. /* Based on SVM classifier analysis of 2D FV (x,y): */
  991. //CV_EXPORTS CvBlobTrackAnalysis* cvCreateModuleBlobTrackAnalysisSVMP();
  992. /* Based on SVM classifier analysis of 4D FV (x,y,vx,vy): */
  993. //CV_EXPORTS CvBlobTrackAnalysis* cvCreateModuleBlobTrackAnalysisSVMPV();
  994. /* Based on SVM classifier analysis of 5D FV (x,y,vx,vy,state): */
  995. //CV_EXPORTS CvBlobTrackAnalysis* cvCreateModuleBlobTrackAnalysisSVMPVS();
  996. /* Based on SVM classifier analysis of 4D FV (startpos,stoppos): */
  997. //CV_EXPORTS CvBlobTrackAnalysis* cvCreateModuleBlobTrackAnalysisSVMSS();
  998. /* Track analysis based on distance between tracks: */
  999. CV_EXPORTS CvBlobTrackAnalysis* cvCreateModuleBlobTrackAnalysisTrackDist();
  1000. /* Analyzer based on reation Road and height map: */
  1001. //CV_EXPORTS CvBlobTrackAnalysis* cvCreateModuleBlobTrackAnalysis3DRoadMap();
  1002. /* Analyzer that makes OR decision using set of analyzers: */
  1003. CV_EXPORTS CvBlobTrackAnalysis* cvCreateModuleBlobTrackAnalysisIOR();
  1004. /* Estimator of human height: */
  1005. class CV_EXPORTS CvBlobTrackAnalysisHeight: public CvBlobTrackAnalysis
  1006. {
  1007. public:
  1008.     virtual double  GetHeight(CvBlob* pB) = 0;
  1009. };
  1010. //CV_EXPORTS CvBlobTrackAnalysisHeight* cvCreateModuleBlobTrackAnalysisHeightScale();
  1011. /* AUTO BLOB TRACKER INTERFACE -- pipeline of 3 modules: */
  1012. class CV_EXPORTS CvBlobTrackerAuto: public CvVSModule
  1013. {
  1014. public:
  1015. CvBlobTrackerAuto(){SetTypeName("BlobTrackerAuto");};
  1016.     virtual void        Process(IplImage* pImg, IplImage* pMask = NULL) = 0;
  1017.     virtual CvBlob*     GetBlob(int index) = 0;
  1018.     virtual CvBlob*     GetBlobByID(int ID) = 0;
  1019.     virtual int         GetBlobNum() = 0;
  1020.     virtual IplImage*   GetFGMask(){return NULL;};
  1021.     virtual float       GetState(int BlobID) = 0;
  1022.     virtual const char*       GetStateDesc(int BlobID) = 0;
  1023.     /* return 0 if trajectory is normal;
  1024.      * return >0 if trajectory abnormal. */
  1025.     virtual void    Release() = 0;
  1026. };
  1027. inline void cvReleaseBlobTrackerAuto(CvBlobTrackerAuto** ppT)
  1028. {
  1029.     ppT[0]->Release();
  1030.     ppT[0] = 0;
  1031. }
  1032. /* END AUTO BLOB TRACKER INTERFACE */
  1033. /* Constructor functions and data for specific BlobTRackerAuto modules: */
  1034. /* Parameters of blobtracker auto ver1: */
  1035. struct CvBlobTrackerAutoParam1
  1036. {
  1037.     int                     FGTrainFrames; /* Number of frames needed for FG (foreground) detector to train.        */
  1038.     CvFGDetector*           pFG;           /* FGDetector module. If this field is NULL the Process FG mask is used. */
  1039.     CvBlobDetector*         pBD;           /* Selected blob detector module.      */
  1040.                                            /* If this field is NULL default blobdetector module will be created.    */
  1041.     CvBlobTracker*          pBT;           /* Selected blob tracking module.     */
  1042.                                            /* If this field is NULL default blobtracker module will be created.     */
  1043.     CvBlobTrackGen*         pBTGen;        /* Selected blob trajectory generator.     */
  1044.                                            /* If this field is NULL no generator is used.                           */
  1045.     CvBlobTrackPostProc*    pBTPP;         /* Selected blob trajectory postprocessing module.     */
  1046.                                            /* If this field is NULL no postprocessing is done.                      */
  1047.     int                     UsePPData;
  1048.     CvBlobTrackAnalysis*    pBTA;          /* Selected blob trajectory analysis module.                             */
  1049.                                            /* If this field is NULL no track analysis is done.                      */
  1050. };
  1051. /* Create blob tracker auto ver1: */
  1052. CV_EXPORTS CvBlobTrackerAuto* cvCreateBlobTrackerAuto1(CvBlobTrackerAutoParam1* param = NULL);
  1053. /* Simple loader for many auto trackers by its type : */
  1054. inline CvBlobTrackerAuto* cvCreateBlobTrackerAuto(int type, void* param)
  1055. {
  1056.     if(type == 0) return cvCreateBlobTrackerAuto1((CvBlobTrackerAutoParam1*)param);
  1057.     return 0;
  1058. }
  1059. struct CvTracksTimePos
  1060. {
  1061.     int len1,len2;
  1062.     int beg1,beg2;
  1063.     int end1,end2;
  1064.     int comLen; //common length for two tracks
  1065.     int shift1,shift2;
  1066. };
  1067. /*CV_EXPORTS int cvCompareTracks( CvBlobTrackSeq *groundTruth,
  1068.                    CvBlobTrackSeq *result,
  1069.                    FILE *file);*/
  1070. /* Constructor functions:  */
  1071. CV_EXPORTS void cvCreateTracks_One(CvBlobTrackSeq *TS);
  1072. CV_EXPORTS void cvCreateTracks_Same(CvBlobTrackSeq *TS1, CvBlobTrackSeq *TS2);
  1073. CV_EXPORTS void cvCreateTracks_AreaErr(CvBlobTrackSeq *TS1, CvBlobTrackSeq *TS2, int addW, int addH);
  1074. /* HIST API */
  1075. class CV_EXPORTS CvProb
  1076. {
  1077. public:
  1078.     virtual ~CvProb() {};
  1079.     /* Calculate probability value: */
  1080.     virtual double Value(int* /*comp*/, int /*x*/ = 0, int /*y*/ = 0){return -1;};
  1081.     /* Update histograpp Pnew = (1-W)*Pold + W*Padd*/
  1082.     /* W weight of new added prob */
  1083.     /* comps - matrix of new fetature vectors used to update prob */
  1084.     virtual void AddFeature(float W, int* comps, int x =0, int y = 0) = 0;
  1085.     virtual void Scale(float factor = 0, int x = -1, int y = -1) = 0;
  1086.     virtual void Release() = 0;
  1087. };
  1088. inline void cvReleaseProb(CvProb** ppProb){ppProb[0]->Release();ppProb[0]=NULL;}
  1089. /* HIST API */
  1090. /* Some Prob: */
  1091. CV_EXPORTS CvProb* cvCreateProbS(int dim, CvSize size, int sample_num);
  1092. CV_EXPORTS CvProb* cvCreateProbMG(int dim, CvSize size, int sample_num);
  1093. CV_EXPORTS CvProb* cvCreateProbMG2(int dim, CvSize size, int sample_num);
  1094. CV_EXPORTS CvProb* cvCreateProbHist(int dim, CvSize size);
  1095. #define CV_BT_HIST_TYPE_S     0
  1096. #define CV_BT_HIST_TYPE_MG    1
  1097. #define CV_BT_HIST_TYPE_MG2   2
  1098. #define CV_BT_HIST_TYPE_H     3
  1099. inline CvProb* cvCreateProb(int type, int dim, CvSize size = cvSize(1,1), void* /*param*/ = NULL)
  1100. {
  1101.     if(type == CV_BT_HIST_TYPE_S) return cvCreateProbS(dim, size, -1);
  1102.     if(type == CV_BT_HIST_TYPE_MG) return cvCreateProbMG(dim, size, -1);
  1103.     if(type == CV_BT_HIST_TYPE_MG2) return cvCreateProbMG2(dim, size, -1);
  1104.     if(type == CV_BT_HIST_TYPE_H) return cvCreateProbHist(dim, size);
  1105.     return NULL;
  1106. }
  1107. /* Noise type definitions: */
  1108. #define CV_NOISE_NONE               0
  1109. #define CV_NOISE_GAUSSIAN           1
  1110. #define CV_NOISE_UNIFORM            2
  1111. #define CV_NOISE_SPECKLE            3
  1112. #define CV_NOISE_SALT_AND_PEPPER    4
  1113. /* Add some noise to image: */
  1114. /* pImg - (input) image without noise */
  1115. /* pImg - (output) image with noise */
  1116. /* noise_type - type of added noise */
  1117. /*  CV_NOISE_GAUSSIAN - pImg += n , n - is gaussian noise with Ampl standart deviation */
  1118. /*  CV_NOISE_UNIFORM - pImg += n , n - is uniform noise with Ampl standart deviation */
  1119. /*  CV_NOISE_SPECKLE - pImg += n*pImg , n - is gaussian noise with Ampl standart deviation */
  1120. /*  CV_NOISE_SALT_AND_PAPPER - pImg = pImg with blacked and whited pixels,
  1121.             Ampl is density of brocken pixels (0-there are not broken pixels, 1 - all pixels are broken)*/
  1122. /* Ampl - "amplitude" of noise */
  1123. CV_EXPORTS void cvAddNoise(IplImage* pImg, int noise_type, double Ampl, CvRandState* rnd_state = NULL);
  1124. /*================== GENERATOR OF TEST VIDEO SEQUENCE ===================== */
  1125. typedef void CvTestSeq;
  1126. /* pConfigfile - Name of file (yml or xml) with description of test sequence */
  1127. /* videos - array of names of test videos described in "pConfigfile" file */
  1128. /* numvideos - size of "videos" array */
  1129. CV_EXPORTS CvTestSeq* cvCreateTestSeq(char* pConfigfile, char** videos, int numvideo, float Scale = 1, int noise_type = CV_NOISE_NONE, double noise_ampl = 0);
  1130. CV_EXPORTS void cvReleaseTestSeq(CvTestSeq** ppTestSeq);
  1131. /* Generate next frame from test video seq and return pointer to it: */
  1132. CV_EXPORTS IplImage* cvTestSeqQueryFrame(CvTestSeq* pTestSeq);
  1133. /* Return pointer to current foreground mask: */
  1134. CV_EXPORTS IplImage* cvTestSeqGetFGMask(CvTestSeq* pTestSeq);
  1135. /* Return pointer to current image: */
  1136. CV_EXPORTS IplImage* cvTestSeqGetImage(CvTestSeq* pTestSeq);
  1137. /* Return frame size of result test video: */
  1138. CV_EXPORTS CvSize cvTestSeqGetImageSize(CvTestSeq* pTestSeq);
  1139. /* Return number of frames result test video: */
  1140. CV_EXPORTS int cvTestSeqFrameNum(CvTestSeq* pTestSeq);
  1141. /* Return number of existing objects.
  1142.  * This is general number of any objects.
  1143.  * For example number of trajectories may be equal or less than returned value:
  1144.  */
  1145. CV_EXPORTS int cvTestSeqGetObjectNum(CvTestSeq* pTestSeq);
  1146. /* Return 0 if there is not position for current defined on current frame */
  1147. /* Return 1 if there is object position and pPos was filled */
  1148. CV_EXPORTS int cvTestSeqGetObjectPos(CvTestSeq* pTestSeq, int ObjIndex, CvPoint2D32f* pPos);
  1149. CV_EXPORTS int cvTestSeqGetObjectSize(CvTestSeq* pTestSeq, int ObjIndex, CvPoint2D32f* pSize);
  1150. /* Add noise to final image: */
  1151. CV_EXPORTS void cvTestSeqAddNoise(CvTestSeq* pTestSeq, int noise_type = CV_NOISE_NONE, double noise_ampl = 0);
  1152. /* Add Intensity variation: */
  1153. CV_EXPORTS void cvTestSeqAddIntensityVariation(CvTestSeq* pTestSeq, float DI_per_frame, float MinI, float MaxI);
  1154. CV_EXPORTS void cvTestSeqSetFrame(CvTestSeq* pTestSeq, int n);
  1155. #endif
  1156. /* End of file. */