16acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn/*M///////////////////////////////////////////////////////////////////////////////////////
26acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn//
36acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn//  IMPORTANT: READ BEFORE DOWNLOADING, COPYING, INSTALLING OR USING.
46acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn//
56acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn//  By downloading, copying, installing or using the software you agree to this license.
66acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn//  If you do not agree to this license, do not download, install,
76acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn//  copy or use the software.
86acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn//
96acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn//
106acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn//                        Intel License Agreement
116acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn//                For Open Source Computer Vision Library
126acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn//
136acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn// Copyright (C) 2000, Intel Corporation, all rights reserved.
146acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn// Third party copyrights are property of their respective owners.
156acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn//
166acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn// Redistribution and use in source and binary forms, with or without modification,
176acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn// are permitted provided that the following conditions are met:
186acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn//
196acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn//   * Redistribution's of source code must retain the above copyright notice,
206acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn//     this list of conditions and the following disclaimer.
216acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn//
226acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn//   * Redistribution's in binary form must reproduce the above copyright notice,
236acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn//     this list of conditions and the following disclaimer in the documentation
246acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn//     and/or other materials provided with the distribution.
256acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn//
266acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn//   * The name of Intel Corporation may not be used to endorse or promote products
276acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn//     derived from this software without specific prior written permission.
286acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn//
296acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn// This software is provided by the copyright holders and contributors "as is" and
306acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn// any express or implied warranties, including, but not limited to, the implied
316acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn// warranties of merchantability and fitness for a particular purpose are disclaimed.
326acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn// In no event shall the Intel Corporation or contributors be liable for any direct,
336acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn// indirect, incidental, special, exemplary, or consequential damages
346acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn// (including, but not limited to, procurement of substitute goods or services;
356acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn// loss of use, data, or profits; or business interruption) however caused
366acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn// and on any theory of liability, whether in contract, strict liability,
376acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn// or tort (including negligence or otherwise) arising in any way out of
386acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn// the use of this software, even if advised of the possibility of such damage.
396acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn//
406acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn//M*/
416acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
426acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
436acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#ifndef __CVVIDEOSURVEILLANCE_H__
446acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#define __CVVIDEOSURVEILLANCE_H__
456acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
466acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn/* Turn off the functionality until cvaux/src/Makefile.am gets updated: */
476acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn//#if _MSC_VER >= 1200
486acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
496acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#include <stdio.h>
506acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
516acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#if _MSC_VER >= 1200 || defined __BORLANDC__
526acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#define cv_stricmp stricmp
536acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#define cv_strnicmp strnicmp
546acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#elif defined __GNUC__
556acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#define cv_stricmp strcasecmp
566acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#define cv_strnicmp strncasecmp
576acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#else
586acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#error Do not know how to make case-insensitive string comparison on this platform
596acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#endif
606acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
616acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn//struct DefParam;
626acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Rennstruct CvDefParam
636acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn{
646acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    struct CvDefParam*    next;
656acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    char*               pName;
666acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    char*               pComment;
676acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    double*             pDouble;
686acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    double              Double;
696acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    float*              pFloat;
706acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    float               Float;
716acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    int*                pInt;
726acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    int                 Int;
736acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    char**              pStr;
746acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    char*               Str;
756acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn};
766acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
776acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Rennclass CV_EXPORTS CvVSModule
786acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn{
796acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Rennprivate: /* Internal data: */
806acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    CvDefParam*   m_pParamList;
816acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    char*       m_pModuleTypeName;
826acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    char*       m_pModuleName;
836acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    char*       m_pNickName;
846acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Rennprotected:
856acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    int         m_Wnd;
866acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Rennpublic: /* Constructor and destructor: */
876acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    CvVSModule()
886acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    {
896acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        m_pNickName = NULL;
906acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        m_pParamList = NULL;
916acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        m_pModuleTypeName = NULL;
926acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        m_pModuleName = NULL;
936acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        m_Wnd = 0;
946acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        AddParam("DebugWnd",&m_Wnd);
956acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    }
966acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    virtual ~CvVSModule()
976acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    {
986acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        CvDefParam* p = m_pParamList;
996acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        for(;p;)
1006acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        {
1016acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            CvDefParam* pf = p;
1026acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            p=p->next;
1036acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            FreeParam(&pf);
1046acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        }
1056acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        m_pParamList=NULL;
1066acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        if(m_pModuleTypeName)free(m_pModuleTypeName);
1076acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        if(m_pModuleName)free(m_pModuleName);
1086acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    }
1096acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Rennprivate: /* Internal functions: */
1106acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    void    FreeParam(CvDefParam** pp)
1116acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    {
1126acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        CvDefParam* p = pp[0];
1136acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        if(p->Str)free(p->Str);
1146acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        if(p->pName)free(p->pName);
1156acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        if(p->pComment)free(p->pComment);
1166acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        cvFree((void**)pp);
1176acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    }
1186acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    CvDefParam* NewParam(const char* name)
1196acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    {
1206acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        CvDefParam* pNew = (CvDefParam*)cvAlloc(sizeof(CvDefParam));
1216acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        memset(pNew,0,sizeof(CvDefParam));
1226acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        pNew->pName = strdup(name);
1236acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        if(m_pParamList==NULL)
1246acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        {
1256acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            m_pParamList = pNew;
1266acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        }
1276acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        else
1286acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        {
1296acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            CvDefParam* p = m_pParamList;
1306acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            for(;p->next;p=p->next);
1316acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            p->next = pNew;
1326acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        }
1336acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        return pNew;
1346acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    };
1356acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
1366acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    CvDefParam* GetParamPtr(int index)
1376acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    {
1386acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        CvDefParam* p = m_pParamList;
1396acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        for(;index>0 && p;index--,p=p->next);
1406acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        return p;
1416acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    }
1426acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    CvDefParam* GetParamPtr(const char* name)
1436acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    {
1446acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        CvDefParam* p = m_pParamList;
1456acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        for(;p;p=p->next)
1466acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        {
1476acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            if(cv_stricmp(p->pName,name)==0) break;
1486acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        }
1496acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        return p;
1506acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    }
1516acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Rennprotected: /* INTERNAL INTERFACE */
1526acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    int  IsParam(const char* name)
1536acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    {
1546acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        return GetParamPtr(name)?1:0;
1556acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    };
1566acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    void AddParam(const char* name, double* pAddr)
1576acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    {
1586acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        NewParam(name)->pDouble = pAddr;
1596acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    };
1606acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    void AddParam(const char* name, float* pAddr)
1616acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    {
1626acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        NewParam(name)->pFloat=pAddr;
1636acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    };
1646acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    void AddParam(const char* name, int* pAddr)
1656acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    {
1666acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        NewParam(name)->pInt=pAddr;
1676acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    };
1686acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    void AddParam(const char* name, char** pAddr)
1696acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    {
1706acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        CvDefParam* pP = NewParam(name);
1716acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        char* p = pAddr?pAddr[0]:NULL;
1726acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        pP->pStr = pAddr?pAddr:&(pP->Str);
1736acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        if(p)
1746acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        {
1756acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            pP->Str = strdup(p);
1766acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            pP->pStr[0] = pP->Str;
1776acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        }
1786acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    };
1796acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    void AddParam(const char* name)
1806acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    {
1816acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        CvDefParam* p = NewParam(name);
1826acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        p->pDouble = &p->Double;
1836acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    };
1846acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    void CommentParam(const char* name, const char* pComment)
1856acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    {
1866acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        CvDefParam* p = GetParamPtr(name);
1876acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        if(p)p->pComment = pComment ? strdup(pComment) : 0;
1886acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    };
1896acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    void SetTypeName(const char* name){m_pModuleTypeName = strdup(name);}
1906acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    void SetModuleName(const char* name){m_pModuleName = strdup(name);}
1916acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    void DelParam(const char* name)
1926acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    {
1936acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        CvDefParam* p = m_pParamList;
1946acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        CvDefParam* pPrev = NULL;
1956acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        for(;p;p=p->next)
1966acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        {
1976acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            if(cv_stricmp(p->pName,name)==0) break;
1986acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            pPrev = p;
1996acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        }
2006acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        if(p)
2016acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        {
2026acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            if(pPrev)
2036acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            {
2046acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                pPrev->next = p->next;
2056acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            }
2066acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            else
2076acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            {
2086acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                m_pParamList = p->next;
2096acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            }
2106acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            FreeParam(&p);
2116acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        }
2126acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    }/* DelParam */
2136acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
2146acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Rennpublic: /* EXTERNAL INTERFACE */
2156acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    char* GetParamName(int index)
2166acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    {
2176acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        CvDefParam* p = GetParamPtr(index);
2186acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        return p?p->pName:NULL;
2196acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    }
2206acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    char* GetParamComment(const char* name)
2216acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    {
2226acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        CvDefParam* p = GetParamPtr(name);
2236acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        if(p && p->pComment) return p->pComment;
2246acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        return NULL;
2256acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    }
2266acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    double GetParam(const char* name)
2276acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    {
2286acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        CvDefParam* p = GetParamPtr(name);
2296acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        if(p)
2306acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        {
2316acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            if(p->pDouble) return p->pDouble[0];
2326acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            if(p->pFloat) return p->pFloat[0];
2336acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            if(p->pInt) return p->pInt[0];
2346acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        }
2356acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        return 0;
2366acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    };
2376acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
2386acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    const char* GetParamStr(const char* name)
2396acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    {
2406acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        CvDefParam* p = GetParamPtr(name);
2416acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        return p?p->Str:NULL;
2426acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    }
2436acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    void   SetParam(const char* name, double val)
2446acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    {
2456acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        CvDefParam* p = m_pParamList;
2466acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        for(;p;p=p->next)
2476acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        {
2486acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            if(cv_stricmp(p->pName,name) != 0) continue;
2496acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            if(p->pDouble)p->pDouble[0] = val;
2506acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            if(p->pFloat)p->pFloat[0] = (float)val;
2516acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            if(p->pInt)p->pInt[0] = cvRound(val);
2526acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        }
2536acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    }
2546acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    void   SetParamStr(const char* name, const char* str)
2556acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    {
2566acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        CvDefParam* p = m_pParamList;
2576acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        for(; p; p=p->next)
2586acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        {
2596acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            if(cv_stricmp(p->pName,name) != 0) continue;
2606acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            if(p->pStr)
2616acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            {
2626acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                if(p->Str)free(p->Str);
2636acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                p->Str = NULL;
2646acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                if(str)p->Str = strdup(str);
2656acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                p->pStr[0] = p->Str;
2666acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            }
2676acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        }
2686acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        /* Convert to double and set: */
2696acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        if(str) SetParam(name,atof(str));
2706acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    }
2716acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    void TransferParamsFromChild(CvVSModule* pM, char* prefix = NULL)
2726acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    {
2736acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        char    tmp[1024];
2746acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        char*   FN = NULL;
2756acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        int i;
2766acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        for(i=0;;++i)
2776acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        {
2786acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            char* N = pM->GetParamName(i);
2796acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            if(N == NULL) break;
2806acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            FN = N;
2816acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            if(prefix)
2826acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            {
2836acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                strcpy(tmp,prefix);
2846acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                strcat(tmp,"_");
2856acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                FN = strcat(tmp,N);
2866acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            }
2876acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
2886acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            if(!IsParam(FN))
2896acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            {
2906acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                if(pM->GetParamStr(N))
2916acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                {
2926acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                    AddParam(FN,(char**)NULL);
2936acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                }
2946acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                else
2956acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                {
2966acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                    AddParam(FN);
2976acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                }
2986acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            }
2996acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            if(pM->GetParamStr(N))
3006acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            {
3016acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                const char* val = pM->GetParamStr(N);
3026acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                SetParamStr(FN,val);
3036acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            }
3046acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            else
3056acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            {
3066acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                double val = pM->GetParam(N);
3076acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                SetParam(FN,val);
3086acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            }
3096acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            CommentParam(FN, pM->GetParamComment(N));
3106acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        }/* transfer next param */
3116acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    }/* Transfer params */
3126acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
3136acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    void TransferParamsToChild(CvVSModule* pM, char* prefix = NULL)
3146acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    {
3156acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        char    tmp[1024];
3166acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        int i;
3176acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        for(i=0;;++i)
3186acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        {
3196acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            char* N = pM->GetParamName(i);
3206acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            if(N == NULL) break;
3216acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            if(prefix)
3226acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            {
3236acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                strcpy(tmp,prefix);
3246acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                strcat(tmp,"_");
3256acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                strcat(tmp,N);
3266acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            }
3276acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            else
3286acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            {
3296acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                strcpy(tmp,N);
3306acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            }
3316acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
3326acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            if(IsParam(tmp))
3336acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            {
3346acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                if(GetParamStr(tmp))
3356acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                    pM->SetParamStr(N,GetParamStr(tmp));
3366acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                else
3376acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                    pM->SetParam(N,GetParam(tmp));
3386acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            }
3396acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        }/* Transfer next parameter */
3406acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        pM->ParamUpdate();
3416acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    }/* Transfer params */
3426acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
3436acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    virtual void ParamUpdate(){};
3446acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    const char*   GetTypeName()
3456acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    {
3466acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        return m_pModuleTypeName;
3476acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    }
3486acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    int     IsModuleTypeName(const char* name)
3496acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    {
3506acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        return m_pModuleTypeName?(cv_stricmp(m_pModuleTypeName,name)==0):0;
3516acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    }
3526acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    char*   GetModuleName()
3536acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    {
3546acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        return m_pModuleName;
3556acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    }
3566acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    int     IsModuleName(const char* name)
3576acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    {
3586acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        return m_pModuleName?(cv_stricmp(m_pModuleName,name)==0):0;
3596acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    }
3606acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    void SetNickName(const char* pStr)
3616acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    {
3626acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        if(m_pNickName)
3636acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            free(m_pNickName);
3646acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
3656acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        m_pNickName = NULL;
3666acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
3676acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        if(pStr)
3686acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            m_pNickName = strdup(pStr);
3696acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    }
3706acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    const char* GetNickName()
3716acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    {
3726acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        return m_pNickName ? m_pNickName : "unknown";
3736acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    }
3746acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    virtual void SaveState(CvFileStorage*){};
3756acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    virtual void LoadState(CvFileStorage*, CvFileNode*){};
3766acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
3776acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    virtual void Release() = 0;
3786acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn};/* CvVMModule */
3796acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Rennvoid inline cvWriteStruct(CvFileStorage* fs, const char* name, void* addr, char* desc, int num=1)
3806acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn{
3816acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    cvStartWriteStruct(fs,name,CV_NODE_SEQ|CV_NODE_FLOW);
3826acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    cvWriteRawData(fs,addr,num,desc);
3836acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    cvEndWriteStruct(fs);
3846acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn}
3856acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Rennvoid inline cvReadStructByName(CvFileStorage* fs, CvFileNode* node, const char* name, void* addr, char* desc)
3866acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn{
3876acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    CvFileNode* pSeqNode = cvGetFileNodeByName(fs, node, name);
3886acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    if(pSeqNode==NULL)
3896acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    {
3906acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        printf("WARNING!!! Can't read structure %s\n",name);
3916acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    }
3926acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    else
3936acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    {
3946acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        if(CV_NODE_IS_SEQ(pSeqNode->tag))
3956acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        {
3966acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            cvReadRawData( fs, pSeqNode, addr, desc );
3976acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        }
3986acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        else
3996acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        {
4006acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            printf("WARNING!!! Structure %s is not sequence and can not be read\n",name);
4016acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        }
4026acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    }
4036acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn}
4046acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
4056acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
4066acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn/* FOREGROUND DETECTOR INTERFACE */
4076acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Rennclass CV_EXPORTS CvFGDetector: public CvVSModule
4086acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn{
4096acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Rennpublic:
4106acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    virtual IplImage* GetMask() = 0;
4116acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    /* Process current image: */
4126acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    virtual void    Process(IplImage* pImg) = 0;
4136acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    /* Release foreground detector: */
4146acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    virtual void    Release() = 0;
4156acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn};
4166acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renninline void cvReleaseFGDetector(CvFGDetector** ppT )
4176acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn{
4186acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    ppT[0]->Release();
4196acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    ppT[0] = 0;
4206acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn}
4216acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn/* FOREGROUND DETECTOR INTERFACE */
4226acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
4236acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RennCV_EXPORTS CvFGDetector* cvCreateFGDetectorBase(int type, void *param);
4246acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
4256acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
4266acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn/* BLOB STRUCTURE*/
4276acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Rennstruct CvBlob
4286acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn{
4296acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    float   x,y; /* blob position   */
4306acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    float   w,h; /* blob sizes      */
4316acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    int     ID;  /* blob ID         */
4326acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn};
4336acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
4346acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renninline CvBlob cvBlob(float x,float y, float w, float h)
4356acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn{
4366acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    CvBlob B = {x,y,w,h,0};
4376acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    return B;
4386acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn}
4396acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#define CV_BLOB_MINW 5
4406acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#define CV_BLOB_MINH 5
4416acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#define CV_BLOB_ID(pB) (((CvBlob*)(pB))->ID)
4426acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#define CV_BLOB_CENTER(pB) cvPoint2D32f(((CvBlob*)(pB))->x,((CvBlob*)(pB))->y)
4436acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#define CV_BLOB_X(pB) (((CvBlob*)(pB))->x)
4446acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#define CV_BLOB_Y(pB) (((CvBlob*)(pB))->y)
4456acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#define CV_BLOB_WX(pB) (((CvBlob*)(pB))->w)
4466acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#define CV_BLOB_WY(pB) (((CvBlob*)(pB))->h)
4476acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#define CV_BLOB_RX(pB) (0.5f*CV_BLOB_WX(pB))
4486acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#define CV_BLOB_RY(pB) (0.5f*CV_BLOB_WY(pB))
4496acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#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)))
4506acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn/* END BLOB STRUCTURE*/
4516acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
4526acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
4536acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn/* simple BLOBLIST */
4546acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Rennclass CV_EXPORTS CvBlobSeq
4556acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn{
4566acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Rennpublic:
4576acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    CvBlobSeq(int BlobSize = sizeof(CvBlob))
4586acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    {
4596acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        m_pMem = cvCreateMemStorage();
4606acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        m_pSeq = cvCreateSeq(0,sizeof(CvSeq),BlobSize,m_pMem);
4616acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        strcpy(m_pElemFormat,"ffffi");
4626acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    }
4636acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    virtual ~CvBlobSeq()
4646acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    {
4656acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        cvReleaseMemStorage(&m_pMem);
4666acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    };
4676acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    virtual CvBlob* GetBlob(int BlobIndex)
4686acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    {
4696acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        return (CvBlob*)cvGetSeqElem(m_pSeq,BlobIndex);
4706acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    };
4716acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    virtual CvBlob* GetBlobByID(int BlobID)
4726acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    {
4736acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        int i;
4746acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        for(i=0; i<m_pSeq->total; ++i)
4756acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            if(BlobID == CV_BLOB_ID(GetBlob(i)))
4766acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                return GetBlob(i);
4776acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        return NULL;
4786acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    };
4796acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    virtual void DelBlob(int BlobIndex)
4806acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    {
4816acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        cvSeqRemove(m_pSeq,BlobIndex);
4826acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    };
4836acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    virtual void DelBlobByID(int BlobID)
4846acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    {
4856acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        int i;
4866acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        for(i=0; i<m_pSeq->total; ++i)
4876acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        {
4886acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            if(BlobID == CV_BLOB_ID(GetBlob(i)))
4896acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            {
4906acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                DelBlob(i);
4916acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                return;
4926acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            }
4936acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        }
4946acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    };
4956acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    virtual void Clear()
4966acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    {
4976acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        cvClearSeq(m_pSeq);
4986acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    };
4996acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    virtual void AddBlob(CvBlob* pB)
5006acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    {
5016acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        cvSeqPush(m_pSeq,pB);
5026acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    };
5036acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    virtual int GetBlobNum()
5046acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    {
5056acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        return m_pSeq->total;
5066acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    };
5076acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    virtual void Write(CvFileStorage* fs, const char* name)
5086acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    {
5096acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        const char*  attr[] = {"dt",m_pElemFormat,NULL};
5106acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        if(fs)
5116acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        {
5126acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            cvWrite(fs,name,m_pSeq,cvAttrList(attr,NULL));
5136acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        }
5146acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    }
5156acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    virtual void Load(CvFileStorage* fs, CvFileNode* node)
5166acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    {
5176acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        if(fs==NULL) return;
5186acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        CvSeq* pSeq = (CvSeq*)cvRead(fs, node);
5196acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        if(pSeq)
5206acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        {
5216acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            int i;
5226acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            cvClearSeq(m_pSeq);
5236acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            for(i=0;i<pSeq->total;++i)
5246acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            {
5256acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                void* pB = cvGetSeqElem( pSeq, i );
5266acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                cvSeqPush( m_pSeq, pB );
5276acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            }
5286acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        }
5296acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    }
5306acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    void AddFormat(char* str){strcat(m_pElemFormat,str);}
5316acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Rennprotected:
5326acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    CvMemStorage*   m_pMem;
5336acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    CvSeq*          m_pSeq;
5346acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    char            m_pElemFormat[1024];
5356acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn};
5366acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn/* simple BLOBLIST */
5376acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
5386acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
5396acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn/* simple TRACKLIST */
5406acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Rennstruct CvBlobTrack
5416acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn{
5426acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    int         TrackID;
5436acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    int         StartFrame;
5446acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    CvBlobSeq*  pBlobSeq;
5456acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn};
5466acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
5476acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Rennclass CV_EXPORTS CvBlobTrackSeq
5486acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn{
5496acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Rennpublic:
5506acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    CvBlobTrackSeq(int TrackSize = sizeof(CvBlobTrack))
5516acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    {
5526acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        m_pMem = cvCreateMemStorage();
5536acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        m_pSeq = cvCreateSeq(0,sizeof(CvSeq),TrackSize,m_pMem);
5546acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    }
5556acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    virtual ~CvBlobTrackSeq()
5566acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    {
5576acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        Clear();
5586acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        cvReleaseMemStorage(&m_pMem);
5596acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    };
5606acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    virtual CvBlobTrack* GetBlobTrack(int TrackIndex)
5616acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    {
5626acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        return (CvBlobTrack*)cvGetSeqElem(m_pSeq,TrackIndex);
5636acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    };
5646acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    virtual CvBlobTrack* GetBlobTrackByID(int TrackID)
5656acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    {
5666acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        int i;
5676acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        for(i=0; i<m_pSeq->total; ++i)
5686acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        {
5696acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            CvBlobTrack* pP = GetBlobTrack(i);
5706acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            if(pP && pP->TrackID == TrackID)
5716acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                return pP;
5726acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        }
5736acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        return NULL;
5746acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    };
5756acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    virtual void DelBlobTrack(int TrackIndex)
5766acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    {
5776acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        CvBlobTrack* pP = GetBlobTrack(TrackIndex);
5786acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        if(pP && pP->pBlobSeq) delete pP->pBlobSeq;
5796acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        cvSeqRemove(m_pSeq,TrackIndex);
5806acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    };
5816acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    virtual void DelBlobTrackByID(int TrackID)
5826acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    {
5836acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        int i;
5846acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        for(i=0; i<m_pSeq->total; ++i)
5856acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        {
5866acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            CvBlobTrack* pP = GetBlobTrack(i);
5876acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            if(TrackID == pP->TrackID)
5886acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            {
5896acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                DelBlobTrack(i);
5906acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                return;
5916acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            }
5926acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        }
5936acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    };
5946acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    virtual void Clear()
5956acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    {
5966acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        int i;
5976acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        for(i=GetBlobTrackNum();i>0;i--)
5986acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        {
5996acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            DelBlobTrack(i-1);
6006acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        }
6016acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        cvClearSeq(m_pSeq);
6026acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    };
6036acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    virtual void AddBlobTrack(int TrackID, int StartFrame = 0)
6046acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    {
6056acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        CvBlobTrack N;
6066acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        N.TrackID = TrackID;
6076acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        N.StartFrame = StartFrame;
6086acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        N.pBlobSeq = new CvBlobSeq;
6096acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        cvSeqPush(m_pSeq,&N);
6106acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    };
6116acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    virtual int GetBlobTrackNum()
6126acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    {
6136acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        return m_pSeq->total;
6146acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    };
6156acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Rennprotected:
6166acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    CvMemStorage*   m_pMem;
6176acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    CvSeq*          m_pSeq;
6186acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn};
6196acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
6206acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn/* simple TRACKLIST */
6216acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
6226acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
6236acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn/* BLOB DETECTOR INTERFACE */
6246acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Rennclass CV_EXPORTS CvBlobDetector: public CvVSModule
6256acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn{
6266acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Rennpublic:
6276acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    /* Try to detect new blob entrance based on foreground mask. */
6286acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    /* pFGMask - image of foreground mask */
6296acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    /* pNewBlob - pointer to CvBlob structure which will be filled if new blob entrance detected */
6306acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    /* pOldBlobList - pointer to blob list which already exist on image */
6316acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    virtual int DetectNewBlob(IplImage* pImg, IplImage* pImgFG, CvBlobSeq* pNewBlobList, CvBlobSeq* pOldBlobList) = 0;
6326acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    /* release blob detector */
6336acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    virtual void Release()=0;
6346acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn};
6356acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn/* Release any blob detector: */
6366acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renninline void cvReleaseBlobDetector(CvBlobDetector** ppBD)
6376acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn{
6386acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    ppBD[0]->Release();
6396acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    ppBD[0] = NULL;
6406acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn}
6416acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn/* END BLOB DETECTOR INTERFACE */
6426acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
6436acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn/* Declarations of constructors of implemented modules: */
6446acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RennCV_EXPORTS CvBlobDetector* cvCreateBlobDetectorSimple();
6456acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RennCV_EXPORTS CvBlobDetector* cvCreateBlobDetectorCC();
6466acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
6476acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
6486acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Rennstruct CV_EXPORTS CvDetectedBlob : public CvBlob
6496acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn{
6506acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    float response;
6516acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn};
6526acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
6536acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RennCV_INLINE CvDetectedBlob cvDetectedBlob( float x, float y, float w, float h, int ID = 0, float response = 0.0F )
6546acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn{
6556acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    CvDetectedBlob b;
6566acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    b.x = x; b.y = y; b.w = w; b.h = h; b.ID = ID; b.response = response;
6576acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    return b;
6586acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn}
6596acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
6606acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
6616acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Rennclass CV_EXPORTS CvObjectDetector
6626acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn{
6636acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Rennpublic:
6646acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    CvObjectDetector( const char* /*detector_file_name*/ = 0 ) {};
6656acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
6666acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    ~CvObjectDetector() {};
6676acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
6686acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    /*
6696acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn     * Release the current detector and load new detector from file
6706acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn     * (if detector_file_name is not 0)
6716acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn     * Return true on success:
6726acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn     */
6736acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    bool Load( const char* /*detector_file_name*/ = 0 ) { return false; }
6746acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
6756acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    /* Return min detector window size: */
6766acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    CvSize GetMinWindowSize() const { return cvSize(0,0); }
6776acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
6786acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    /* Return max border: */
6796acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    int GetMaxBorderSize() const { return 0; }
6806acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
6816acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    /*
6826acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn     * Detect the object on the image and push the detected
6836acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn     * blobs into <detected_blob_seq> which must be the sequence of <CvDetectedBlob>s
6846acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn     */
6856acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    void Detect( const CvArr* /*img*/, /* out */ CvBlobSeq* /*detected_blob_seq*/ = 0 ) {};
6866acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
6876acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Rennprotected:
6886acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    class CvObjectDetectorImpl* impl;
6896acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn};
6906acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
6916acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
6926acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RennCV_INLINE CvRect cvRectIntersection( const CvRect r1, const CvRect r2 )
6936acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn{
6946acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    CvRect r = cvRect( MAX(r1.x, r2.x), MAX(r1.y, r2.y), 0, 0 );
6956acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
6966acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    r.width  = MIN(r1.x + r1.width, r2.x + r2.width) - r.x;
6976acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    r.height = MIN(r1.y + r1.height, r2.y + r2.height) - r.y;
6986acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
6996acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    return r;
7006acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn}
7016acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
7026acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
7036acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn/*
7046acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn * CvImageDrawer
7056acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn *
7066acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn * Draw on an image the specified ROIs from the source image and
7076acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn * given blobs as ellipses or rectangles:
7086acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn */
7096acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
7106acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Rennstruct CvDrawShape
7116acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn{
7126acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    enum {RECT, ELLIPSE} shape;
7136acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    CvScalar color;
7146acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn};
7156acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
7166acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn/*extern const CvDrawShape icv_shape[] =
7176acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn{
7186acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    { CvDrawShape::ELLIPSE, CV_RGB(255,0,0) },
7196acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    { CvDrawShape::ELLIPSE, CV_RGB(0,255,0) },
7206acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    { CvDrawShape::ELLIPSE, CV_RGB(0,0,255) },
7216acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    { CvDrawShape::ELLIPSE, CV_RGB(255,255,0) },
7226acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    { CvDrawShape::ELLIPSE, CV_RGB(0,255,255) },
7236acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    { CvDrawShape::ELLIPSE, CV_RGB(255,0,255) }
7246acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn};*/
7256acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
7266acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Rennclass CV_EXPORTS CvImageDrawer
7276acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn{
7286acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Rennpublic:
7296acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    CvImageDrawer() : m_image(0) {}
7306acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    ~CvImageDrawer() { cvReleaseImage( &m_image ); }
7316acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    void SetShapes( const CvDrawShape* shapes, int num );
7326acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    /* <blob_seq> must be the sequence of <CvDetectedBlob>s */
7336acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    IplImage* Draw( const CvArr* src, CvBlobSeq* blob_seq = 0, const CvSeq* roi_seq = 0 );
7346acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    IplImage* GetImage() { return m_image; }
7356acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Rennprotected:
7366acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    //static const int MAX_SHAPES = sizeof(icv_shape) / sizeof(icv_shape[0]);;
7376acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
7386acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    IplImage* m_image;
7396acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    CvDrawShape m_shape[16];
7406acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn};
7416acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
7426acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
7436acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
7446acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn/* Trajectory generation module: */
7456acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Rennclass CV_EXPORTS CvBlobTrackGen: public CvVSModule
7466acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn{
7476acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Rennpublic:
7486acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    virtual void    SetFileName(char* pFileName) = 0;
7496acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    virtual void    AddBlob(CvBlob* pBlob) = 0;
7506acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    virtual void    Process(IplImage* pImg = NULL, IplImage* pFG = NULL) = 0;
7516acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    virtual void    Release() = 0;
7526acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn};
7536acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
7546acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renninline void cvReleaseBlobTrackGen(CvBlobTrackGen** pBTGen)
7556acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn{
7566acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    if(*pBTGen)(*pBTGen)->Release();
7576acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    *pBTGen = 0;
7586acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn}
7596acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
7606acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn/* Declarations of constructors of implemented modules: */
7616acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RennCV_EXPORTS CvBlobTrackGen* cvCreateModuleBlobTrackGen1();
7626acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RennCV_EXPORTS CvBlobTrackGen* cvCreateModuleBlobTrackGenYML();
7636acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
7646acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
7656acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
7666acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn/* BLOB TRACKER INTERFACE */
7676acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Rennclass CV_EXPORTS CvBlobTracker: public CvVSModule
7686acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn{
7696acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Rennpublic:
7706acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    CvBlobTracker(){SetTypeName("BlobTracker");};
7716acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
7726acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    /* Add new blob to track it and assign to this blob personal ID */
7736acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    /* pBlob - pointer to structure with blob parameters (ID is ignored)*/
7746acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    /* pImg - current image */
7756acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    /* pImgFG - current foreground mask */
7766acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    /* Return pointer to new added blob: */
7776acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    virtual CvBlob* AddBlob(CvBlob* pBlob, IplImage* pImg, IplImage* pImgFG = NULL ) = 0;
7786acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
7796acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    /* Return number of currently tracked blobs: */
7806acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    virtual int     GetBlobNum() = 0;
7816acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
7826acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    /* Return pointer to specified by index blob: */
7836acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    virtual CvBlob* GetBlob(int BlobIndex) = 0;
7846acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
7856acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    /* Delete blob by its index: */
7866acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    virtual void    DelBlob(int BlobIndex) = 0;
7876acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
7886acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    /* Process current image and track all existed blobs: */
7896acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    virtual void    Process(IplImage* pImg, IplImage* pImgFG = NULL) = 0;
7906acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
7916acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    /* Release blob tracker: */
7926acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    virtual void    Release() = 0;
7936acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
7946acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
7956acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    /* Process one blob (for multi hypothesis tracing): */
7966acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    virtual void ProcessBlob(int BlobIndex, CvBlob* pBlob, IplImage* /*pImg*/, IplImage* /*pImgFG*/ = NULL)
7976acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    {
7986acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        CvBlob* pB;
7996acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        int ID = 0;
8006acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        assert(pBlob);
8016acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        //pBlob->ID;
8026acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        pB = GetBlob(BlobIndex);
8036acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        if(pB)
8046acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            pBlob[0] = pB[0];
8056acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        pBlob->ID = ID;
8066acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    };
8076acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
8086acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    /* Get confidence/wieght/probability (0-1) for blob: */
8096acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    virtual double  GetConfidence(int /*BlobIndex*/, CvBlob* /*pBlob*/, IplImage* /*pImg*/, IplImage* /*pImgFG*/ = NULL)
8106acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    {
8116acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        return 1;
8126acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    };
8136acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
8146acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    virtual double GetConfidenceList(CvBlobSeq* pBlobList, IplImage* pImg, IplImage* pImgFG = NULL)
8156acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    {
8166acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        int     b,bN = pBlobList->GetBlobNum();
8176acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        double  W = 1;
8186acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        for(b=0;b<bN;++b)
8196acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        {
8206acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            CvBlob* pB = pBlobList->GetBlob(b);
8216acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            int     BI = GetBlobIndexByID(pB->ID);
8226acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            W *= GetConfidence(BI,pB,pImg,pImgFG);
8236acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        }
8246acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        return W;
8256acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    };
8266acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
8276acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    virtual void UpdateBlob(int /*BlobIndex*/, CvBlob* /*pBlob*/, IplImage* /*pImg*/, IplImage* /*pImgFG*/ = NULL){};
8286acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
8296acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    /* Update all blob models: */
8306acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    virtual void Update(IplImage* pImg, IplImage* pImgFG = NULL)
8316acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    {
8326acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        int i;
8336acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        for(i=GetBlobNum();i>0;i--)
8346acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        {
8356acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            CvBlob* pB=GetBlob(i-1);
8366acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            UpdateBlob(i-1, pB, pImg, pImgFG);
8376acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        }
8386acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
8396acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    };
8406acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
8416acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    /* Return pointer to blob by its unique ID: */
8426acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    virtual int     GetBlobIndexByID(int BlobID)
8436acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    {
8446acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        int i;
8456acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        for(i=GetBlobNum();i>0;i--)
8466acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        {
8476acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            CvBlob* pB=GetBlob(i-1);
8486acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            if(CV_BLOB_ID(pB) == BlobID) return i-1;
8496acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        }
8506acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        return -1;
8516acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    };
8526acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
8536acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    /* Return pointer to blob by its unique ID: */
8546acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    virtual CvBlob* GetBlobByID(int BlobID){return GetBlob(GetBlobIndexByID(BlobID));};
8556acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
8566acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    /* Delete blob by its ID: */
8576acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    virtual void    DelBlobByID(int BlobID){DelBlob(GetBlobIndexByID(BlobID));};
8586acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
8596acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    /* Set new parameters for specified (by index) blob: */
8606acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    virtual void    SetBlob(int /*BlobIndex*/, CvBlob* /*pBlob*/){};
8616acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
8626acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    /* Set new parameters for specified (by ID) blob: */
8636acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    virtual void    SetBlobByID(int BlobID, CvBlob* pBlob)
8646acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    {
8656acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        SetBlob(GetBlobIndexByID(BlobID),pBlob);
8666acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    };
8676acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
8686acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    /*  ===============  MULTI HYPOTHESIS INTERFACE ==================  */
8696acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
8706acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    /* Return number of position hyposetis of currently tracked blob: */
8716acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    virtual int     GetBlobHypNum(int /*BlobIdx*/){return 1;};
8726acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
8736acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    /* Return pointer to specified blob hypothesis by index blob: */
8746acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    virtual CvBlob* GetBlobHyp(int BlobIndex, int /*hypothesis*/){return GetBlob(BlobIndex);};
8756acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
8766acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    /* Set new parameters for specified (by index) blob hyp
8776acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn     * (can be called several times for each hyp ):
8786acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn     */
8796acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    virtual void    SetBlobHyp(int /*BlobIndex*/, CvBlob* /*pBlob*/){};
8806acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn};
8816acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renninline void cvReleaseBlobTracker(CvBlobTracker**ppT )
8826acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn{
8836acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    ppT[0]->Release();
8846acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    ppT[0] = 0;
8856acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn}
8866acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn/* BLOB TRACKER INTERFACE */
8876acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
8886acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn/*BLOB TRACKER ONE INTERFACE */
8896acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Rennclass CV_EXPORTS CvBlobTrackerOne:public CvVSModule
8906acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn{
8916acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Rennpublic:
8926acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    virtual void Init(CvBlob* pBlobInit, IplImage* pImg, IplImage* pImgFG = NULL) = 0;
8936acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    virtual CvBlob* Process(CvBlob* pBlobPrev, IplImage* pImg, IplImage* pImgFG = NULL) = 0;
8946acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    virtual void Release() =  0;
8956acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
8966acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    /* Non-required methods: */
8976acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    virtual void SkipProcess(CvBlob* /*pBlobPrev*/, IplImage* /*pImg*/, IplImage* /*pImgFG*/ = NULL){};
8986acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    virtual void Update(CvBlob* /*pBlob*/, IplImage* /*pImg*/, IplImage* /*pImgFG*/ = NULL){};
8996acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    virtual void SetCollision(int /*CollisionFlag*/){}; /* call in case of blob collision situation*/
9006acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    virtual double GetConfidence(CvBlob* /*pBlob*/, IplImage* /*pImg*/,
9016acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                                 IplImage* /*pImgFG*/ = NULL, IplImage* /*pImgUnusedReg*/ = NULL)
9026acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    {
9036acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        return 1;
9046acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    };
9056acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn};
9066acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renninline void cvReleaseBlobTrackerOne(CvBlobTrackerOne **ppT )
9076acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn{
9086acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    ppT[0]->Release();
9096acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    ppT[0] = 0;
9106acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn}
9116acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RennCV_EXPORTS CvBlobTracker* cvCreateBlobTrackerList(CvBlobTrackerOne* (*create)());
9126acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn/*BLOB TRACKER ONE INTERFACE */
9136acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
9146acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn/* Declarations of constructors of implemented modules: */
9156acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
9166acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn/* Some declarations for specific MeanShift tracker: */
9176acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#define PROFILE_EPANECHNIKOV    0
9186acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#define PROFILE_DOG             1
9196acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Rennstruct CvBlobTrackerParamMS
9206acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn{
9216acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    int     noOfSigBits;
9226acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    int     appearance_profile;
9236acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    int     meanshift_profile;
9246acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    float   sigma;
9256acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn};
9266acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
9276acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RennCV_EXPORTS CvBlobTracker* cvCreateBlobTrackerMS1(CvBlobTrackerParamMS* param);
9286acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RennCV_EXPORTS CvBlobTracker* cvCreateBlobTrackerMS2(CvBlobTrackerParamMS* param);
9296acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RennCV_EXPORTS CvBlobTracker* cvCreateBlobTrackerMS1ByList();
9306acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
9316acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn/* Some declarations for specific Likelihood tracker: */
9326acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Rennstruct CvBlobTrackerParamLH
9336acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn{
9346acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    int     HistType; /* see Prob.h */
9356acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    int     ScaleAfter;
9366acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn};
9376acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
9386acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn/* Without scale optimization: */
9396acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RennCV_EXPORTS CvBlobTracker* cvCreateBlobTrackerLHR(CvBlobTrackerParamLH* /*param*/ = NULL);
9406acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
9416acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn/* With scale optimization: */
9426acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RennCV_EXPORTS CvBlobTracker* cvCreateBlobTrackerLHRS(CvBlobTrackerParamLH* /*param*/ = NULL);
9436acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
9446acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn/* Simple blob tracker based on connected component tracking: */
9456acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RennCV_EXPORTS CvBlobTracker* cvCreateBlobTrackerCC();
9466acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
9476acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn/* Connected component tracking and mean-shift particle filter collion-resolver: */
9486acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RennCV_EXPORTS CvBlobTracker* cvCreateBlobTrackerCCMSPF();
9496acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
9506acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn/* Blob tracker that integrates meanshift and connected components: */
9516acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RennCV_EXPORTS CvBlobTracker* cvCreateBlobTrackerMSFG();
9526acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RennCV_EXPORTS CvBlobTracker* cvCreateBlobTrackerMSFGS();
9536acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
9546acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn/* Meanshift without connected-components */
9556acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RennCV_EXPORTS CvBlobTracker* cvCreateBlobTrackerMS();
9566acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
9576acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn/* Particle filtering via Bhattacharya coefficient, which        */
9586acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn/* is roughly the dot-product of two probability densities.      */
9596acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn/* See: Real-Time Tracking of Non-Rigid Objects using Mean Shift */
9606acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn/*      Comanicius, Ramesh, Meer, 2000, 8p                       */
9616acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn/*      http://citeseer.ist.psu.edu/321441.html                  */
9626acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RennCV_EXPORTS CvBlobTracker* cvCreateBlobTrackerMSPF();
9636acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
9646acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn/* =========== tracker integrators trackers =============*/
9656acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
9666acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn/* Integrator based on Particle Filtering method: */
9676acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn//CV_EXPORTS CvBlobTracker* cvCreateBlobTrackerIPF();
9686acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
9696acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn/* Rule based integrator: */
9706acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn//CV_EXPORTS CvBlobTracker* cvCreateBlobTrackerIRB();
9716acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
9726acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn/* Integrator based on data fusion using particle filtering: */
9736acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn//CV_EXPORTS CvBlobTracker* cvCreateBlobTrackerIPFDF();
9746acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
9756acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
9766acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
9776acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
9786acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn/* Trajectory postprocessing module: */
9796acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Rennclass CV_EXPORTS CvBlobTrackPostProc: public CvVSModule
9806acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn{
9816acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Rennpublic:
9826acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    virtual void    AddBlob(CvBlob* pBlob) = 0;
9836acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    virtual void    Process() = 0;
9846acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    virtual int     GetBlobNum() = 0;
9856acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    virtual CvBlob* GetBlob(int index) = 0;
9866acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    virtual void    Release() = 0;
9876acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
9886acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    /* Additional functionality: */
9896acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    virtual CvBlob* GetBlobByID(int BlobID)
9906acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    {
9916acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        int i;
9926acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        for(i=GetBlobNum();i>0;i--)
9936acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        {
9946acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            CvBlob* pB=GetBlob(i-1);
9956acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            if(pB->ID==BlobID) return pB;
9966acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        }
9976acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        return NULL;
9986acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    };
9996acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn};
10006acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
10016acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renninline void cvReleaseBlobTrackPostProc(CvBlobTrackPostProc** pBTPP)
10026acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn{
10036acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    if(pBTPP == NULL) return;
10046acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    if(*pBTPP)(*pBTPP)->Release();
10056acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    *pBTPP = 0;
10066acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn}
10076acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
10086acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn/* Trajectory generation module: */
10096acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Rennclass CV_EXPORTS CvBlobTrackPostProcOne: public CvVSModule
10106acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn{
10116acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Rennpublic:
10126acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    virtual CvBlob* Process(CvBlob* pBlob) = 0;
10136acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    virtual void    Release() = 0;
10146acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn};
10156acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
10166acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn/* Create blob tracking post processing module based on simle module: */
10176acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RennCV_EXPORTS CvBlobTrackPostProc* cvCreateBlobTrackPostProcList(CvBlobTrackPostProcOne* (*create)());
10186acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
10196acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
10206acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn/* Declarations of constructors of implemented modules: */
10216acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RennCV_EXPORTS CvBlobTrackPostProc* cvCreateModuleBlobTrackPostProcKalman();
10226acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RennCV_EXPORTS CvBlobTrackPostProc* cvCreateModuleBlobTrackPostProcTimeAverRect();
10236acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RennCV_EXPORTS CvBlobTrackPostProc* cvCreateModuleBlobTrackPostProcTimeAverExp();
10246acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
10256acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
10266acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn/* PREDICTORS */
10276acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn/* blob PREDICTOR */
10286acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Rennclass CvBlobTrackPredictor: public CvVSModule
10296acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn{
10306acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Rennpublic:
10316acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    virtual CvBlob* Predict() = 0;
10326acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    virtual void    Update(CvBlob* pBlob) = 0;
10336acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    virtual void    Release() = 0;
10346acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn};
10356acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RennCV_EXPORTS CvBlobTrackPredictor* cvCreateModuleBlobTrackPredictKalman();
10366acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
10376acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
10386acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
10396acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn/* Trajectory analyser module: */
10406acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Rennclass CV_EXPORTS CvBlobTrackAnalysis: public CvVSModule
10416acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn{
10426acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Rennpublic:
10436acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    virtual void    AddBlob(CvBlob* pBlob) = 0;
10446acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    virtual void    Process(IplImage* pImg, IplImage* pFG) = 0;
10456acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    virtual float   GetState(int BlobID) = 0;
10466acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    /* return 0 if trajectory is normal
10476acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn       return >0 if trajectory abnormal */
10486acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    virtual char*   GetStateDesc(int /*BlobID*/){return NULL;};
10496acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    virtual void    SetFileName(char* /*DataBaseName*/){};
10506acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    virtual void    Release() = 0;
10516acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn};
10526acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
10536acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
10546acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renninline void cvReleaseBlobTrackAnalysis(CvBlobTrackAnalysis** pBTPP)
10556acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn{
10566acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    if(pBTPP == NULL) return;
10576acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    if(*pBTPP)(*pBTPP)->Release();
10586acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    *pBTPP = 0;
10596acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn}
10606acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
10616acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn/* Feature-vector generation module: */
10626acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Rennclass CV_EXPORTS CvBlobTrackFVGen : public CvVSModule
10636acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn{
10646acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Rennpublic:
10656acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    virtual void    AddBlob(CvBlob* pBlob) = 0;
10666acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    virtual void    Process(IplImage* pImg, IplImage* pFG) = 0;
10676acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    virtual void    Release() = 0;
10686acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    virtual int     GetFVSize() = 0;
10696acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    virtual int     GetFVNum() = 0;
10706acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    virtual float*  GetFV(int index, int* pFVID) = 0; /* Returns pointer to FV, if return 0 then FV not created */
10716acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    virtual float*  GetFVVar(){return NULL;}; /* Returns pointer to array of variation of values of FV, if returns 0 then FVVar does not exist. */
10726acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    virtual float*  GetFVMin() = 0; /* Returns pointer to array of minimal values of FV, if returns 0 then FVrange does not exist */
10736acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    virtual float*  GetFVMax() = 0; /* Returns pointer to array of maximal values of FV, if returns 0 then FVrange does not exist */
10746acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn};
10756acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
10766acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
10776acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn/* Trajectory Analyser module: */
10786acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Rennclass CV_EXPORTS CvBlobTrackAnalysisOne
10796acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn{
10806acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Rennpublic:
10816acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    virtual ~CvBlobTrackAnalysisOne() {};
10826acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    virtual int     Process(CvBlob* pBlob, IplImage* pImg, IplImage* pFG) = 0;
10836acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    /* return 0 if trajectory is normal
10846acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn       return >0 if trajectory abnormal */
10856acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    virtual void    Release() = 0;
10866acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn};
10876acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
10886acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn/* Create blob tracking post processing module based on simle module: */
10896acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RennCV_EXPORTS CvBlobTrackAnalysis* cvCreateBlobTrackAnalysisList(CvBlobTrackAnalysisOne* (*create)());
10906acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
10916acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn/* Declarations of constructors of implemented modules: */
10926acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
10936acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn/* Based on histogram analysis of 2D FV (x,y): */
10946acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RennCV_EXPORTS CvBlobTrackAnalysis* cvCreateModuleBlobTrackAnalysisHistP();
10956acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
10966acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn/* Based on histogram analysis of 4D FV (x,y,vx,vy): */
10976acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RennCV_EXPORTS CvBlobTrackAnalysis* cvCreateModuleBlobTrackAnalysisHistPV();
10986acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
10996acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn/* Based on histogram analysis of 5D FV (x,y,vx,vy,state): */
11006acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RennCV_EXPORTS CvBlobTrackAnalysis* cvCreateModuleBlobTrackAnalysisHistPVS();
11016acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
11026acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn/* Based on histogram analysis of 4D FV (startpos,stoppos): */
11036acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RennCV_EXPORTS CvBlobTrackAnalysis* cvCreateModuleBlobTrackAnalysisHistSS();
11046acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
11056acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
11066acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
11076acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn/* Based on SVM classifier analysis of 2D FV (x,y): */
11086acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn//CV_EXPORTS CvBlobTrackAnalysis* cvCreateModuleBlobTrackAnalysisSVMP();
11096acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
11106acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn/* Based on SVM classifier analysis of 4D FV (x,y,vx,vy): */
11116acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn//CV_EXPORTS CvBlobTrackAnalysis* cvCreateModuleBlobTrackAnalysisSVMPV();
11126acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
11136acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn/* Based on SVM classifier analysis of 5D FV (x,y,vx,vy,state): */
11146acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn//CV_EXPORTS CvBlobTrackAnalysis* cvCreateModuleBlobTrackAnalysisSVMPVS();
11156acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
11166acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn/* Based on SVM classifier analysis of 4D FV (startpos,stoppos): */
11176acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn//CV_EXPORTS CvBlobTrackAnalysis* cvCreateModuleBlobTrackAnalysisSVMSS();
11186acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
11196acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn/* Track analysis based on distance between tracks: */
11206acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RennCV_EXPORTS CvBlobTrackAnalysis* cvCreateModuleBlobTrackAnalysisTrackDist();
11216acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
11226acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn/* Analyzer based on reation Road and height map: */
11236acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn//CV_EXPORTS CvBlobTrackAnalysis* cvCreateModuleBlobTrackAnalysis3DRoadMap();
11246acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
11256acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn/* Analyzer that makes OR decision using set of analyzers: */
11266acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RennCV_EXPORTS CvBlobTrackAnalysis* cvCreateModuleBlobTrackAnalysisIOR();
11276acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
11286acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn/* Estimator of human height: */
11296acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Rennclass CV_EXPORTS CvBlobTrackAnalysisHeight: public CvBlobTrackAnalysis
11306acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn{
11316acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Rennpublic:
11326acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    virtual double  GetHeight(CvBlob* pB) = 0;
11336acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn};
11346acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn//CV_EXPORTS CvBlobTrackAnalysisHeight* cvCreateModuleBlobTrackAnalysisHeightScale();
11356acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
11366acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
11376acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
11386acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn/* AUTO BLOB TRACKER INTERFACE -- pipeline of 3 modules: */
11396acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Rennclass CV_EXPORTS CvBlobTrackerAuto: public CvVSModule
11406acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn{
11416acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Rennpublic:
11426acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    virtual void        Process(IplImage* pImg, IplImage* pMask = NULL) = 0;
11436acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    virtual CvBlob*     GetBlob(int index) = 0;
11446acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    virtual CvBlob*     GetBlobByID(int ID) = 0;
11456acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    virtual int         GetBlobNum() = 0;
11466acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    virtual IplImage*   GetFGMask(){return NULL;};
11476acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    virtual float       GetState(int BlobID) = 0;
11486acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    virtual char*       GetStateDesc(int BlobID) = 0;
11496acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    /* return 0 if trajectory is normal;
11506acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn     * return >0 if trajectory abnormal. */
11516acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    virtual void    Release() = 0;
11526acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn};
11536acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renninline void cvReleaseBlobTrackerAuto(CvBlobTrackerAuto** ppT)
11546acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn{
11556acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    ppT[0]->Release();
11566acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    ppT[0] = 0;
11576acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn}
11586acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn/* END AUTO BLOB TRACKER INTERFACE */
11596acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
11606acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
11616acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn/* Constructor functions and data for specific BlobTRackerAuto modules: */
11626acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
11636acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn/* Parameters of blobtracker auto ver1: */
11646acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Rennstruct CvBlobTrackerAutoParam1
11656acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn{
11666acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    int                     FGTrainFrames; /* Number of frames needed for FG (foreground) detector to train.        */
11676acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
11686acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    CvFGDetector*           pFG;           /* FGDetector module. If this field is NULL the Process FG mask is used. */
11696acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
11706acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    CvBlobDetector*         pBD;           /* Selected blob detector module. 					    */
11716acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                                           /* If this field is NULL default blobdetector module will be created.    */
11726acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
11736acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    CvBlobTracker*          pBT;           /* Selected blob tracking module.					    */
11746acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                                           /* If this field is NULL default blobtracker module will be created.     */
11756acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
11766acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    CvBlobTrackGen*         pBTGen;        /* Selected blob trajectory generator.				    */
11776acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                                           /* If this field is NULL no generator is used.                           */
11786acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
11796acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    CvBlobTrackPostProc*    pBTPP;         /* Selected blob trajectory postprocessing module.			    */
11806acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                                           /* If this field is NULL no postprocessing is done.                      */
11816acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
11826acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    int                     UsePPData;
11836acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
11846acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    CvBlobTrackAnalysis*    pBTA;          /* Selected blob trajectory analysis module.                             */
11856acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                                           /* If this field is NULL no track analysis is done.                      */
11866acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn};
11876acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
11886acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn/* Create blob tracker auto ver1: */
11896acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RennCV_EXPORTS CvBlobTrackerAuto* cvCreateBlobTrackerAuto1(CvBlobTrackerAutoParam1* param = NULL);
11906acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
11916acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn/* Simple loader for many auto trackers by its type : */
11926acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renninline CvBlobTrackerAuto* cvCreateBlobTrackerAuto(int type, void* param)
11936acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn{
11946acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    if(type == 0) return cvCreateBlobTrackerAuto1((CvBlobTrackerAutoParam1*)param);
11956acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    return 0;
11966acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn}
11976acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
11986acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
11996acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
12006acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Rennstruct CvTracksTimePos
12016acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn{
12026acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    int len1,len2;
12036acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    int beg1,beg2;
12046acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    int end1,end2;
12056acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    int comLen; //common length for two tracks
12066acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    int shift1,shift2;
12076acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn};
12086acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
12096acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn/*CV_EXPORTS int cvCompareTracks( CvBlobTrackSeq *groundTruth,
12106acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                   CvBlobTrackSeq *result,
12116acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                   FILE *file);*/
12126acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
12136acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
12146acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn/* Constructor functions:  */
12156acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
12166acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RennCV_EXPORTS void cvCreateTracks_One(CvBlobTrackSeq *TS);
12176acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RennCV_EXPORTS void cvCreateTracks_Same(CvBlobTrackSeq *TS1, CvBlobTrackSeq *TS2);
12186acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RennCV_EXPORTS void cvCreateTracks_AreaErr(CvBlobTrackSeq *TS1, CvBlobTrackSeq *TS2, int addW, int addH);
12196acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
12206acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
12216acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn/* HIST API */
12226acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Rennclass CV_EXPORTS CvProb
12236acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn{
12246acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Rennpublic:
12256acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    virtual ~CvProb() {};
12266acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
12276acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    /* Calculate probability value: */
12286acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    virtual double Value(int* /*comp*/, int /*x*/ = 0, int /*y*/ = 0){return -1;};
12296acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
12306acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    /* Update histograpp Pnew = (1-W)*Pold + W*Padd*/
12316acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    /* W weight of new added prob */
12326acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    /* comps - matrix of new fetature vectors used to update prob */
12336acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    virtual void AddFeature(float W, int* comps, int x =0, int y = 0) = 0;
12346acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    virtual void Scale(float factor = 0, int x = -1, int y = -1) = 0;
12356acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    virtual void Release() = 0;
12366acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn};
12376acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renninline void cvReleaseProb(CvProb** ppProb){ppProb[0]->Release();ppProb[0]=NULL;}
12386acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn/* HIST API */
12396acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
12406acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn/* Some Prob: */
12416acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RennCV_EXPORTS CvProb* cvCreateProbS(int dim, CvSize size, int sample_num);
12426acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RennCV_EXPORTS CvProb* cvCreateProbMG(int dim, CvSize size, int sample_num);
12436acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RennCV_EXPORTS CvProb* cvCreateProbMG2(int dim, CvSize size, int sample_num);
12446acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RennCV_EXPORTS CvProb* cvCreateProbHist(int dim, CvSize size);
12456acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
12466acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#define CV_BT_HIST_TYPE_S     0
12476acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#define CV_BT_HIST_TYPE_MG    1
12486acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#define CV_BT_HIST_TYPE_MG2   2
12496acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#define CV_BT_HIST_TYPE_H     3
12506acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renninline CvProb* cvCreateProb(int type, int dim, CvSize size = cvSize(1,1), void* /*param*/ = NULL)
12516acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn{
12526acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    if(type == CV_BT_HIST_TYPE_S) return cvCreateProbS(dim, size, -1);
12536acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    if(type == CV_BT_HIST_TYPE_MG) return cvCreateProbMG(dim, size, -1);
12546acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    if(type == CV_BT_HIST_TYPE_MG2) return cvCreateProbMG2(dim, size, -1);
12556acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    if(type == CV_BT_HIST_TYPE_H) return cvCreateProbHist(dim, size);
12566acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    return NULL;
12576acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn}
12586acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
12596acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
12606acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
12616acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn/* Noise type definitions: */
12626acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#define CV_NOISE_NONE               0
12636acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#define CV_NOISE_GAUSSIAN           1
12646acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#define CV_NOISE_UNIFORM            2
12656acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#define CV_NOISE_SPECKLE            3
12666acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#define CV_NOISE_SALT_AND_PEPPER    4
12676acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
12686acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn/* Add some noise to image: */
12696acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn/* pImg - (input) image without noise */
12706acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn/* pImg - (output) image with noise */
12716acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn/* noise_type - type of added noise */
12726acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn/*  CV_NOISE_GAUSSIAN - pImg += n , n - is gaussian noise with Ampl standart deviation */
12736acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn/*  CV_NOISE_UNIFORM - pImg += n , n - is uniform noise with Ampl standart deviation */
12746acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn/*  CV_NOISE_SPECKLE - pImg += n*pImg , n - is gaussian noise with Ampl standart deviation */
12756acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn/*  CV_NOISE_SALT_AND_PAPPER - pImg = pImg with blacked and whited pixels,
12766acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            Ampl is density of brocken pixels (0-there are not broken pixels, 1 - all pixels are broken)*/
12776acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn/* Ampl - "amplitude" of noise */
12786acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RennCV_EXPORTS void cvAddNoise(IplImage* pImg, int noise_type, double Ampl, CvRandState* rnd_state = NULL);
12796acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
12806acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn/*================== GENERATOR OF TEST VIDEO SEQUENCE ===================== */
12816acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renntypedef void CvTestSeq;
12826acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
12836acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn/* pConfigfile - Name of file (yml or xml) with description of test sequence */
12846acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn/* videos - array of names of test videos described in "pConfigfile" file */
12856acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn/* numvideos - size of "videos" array */
12866acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RennCV_EXPORTS CvTestSeq* cvCreateTestSeq(char* pConfigfile, char** videos, int numvideo, float Scale = 1, int noise_type = CV_NOISE_NONE, double noise_ampl = 0);
12876acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RennCV_EXPORTS void cvReleaseTestSeq(CvTestSeq** ppTestSeq);
12886acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
12896acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn/* Generate next frame from test video seq and return pointer to it: */
12906acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RennCV_EXPORTS IplImage* cvTestSeqQueryFrame(CvTestSeq* pTestSeq);
12916acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
12926acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn/* Return pointer to current foreground mask: */
12936acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RennCV_EXPORTS IplImage* cvTestSeqGetFGMask(CvTestSeq* pTestSeq);
12946acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
12956acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn/* Return pointer to current image: */
12966acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RennCV_EXPORTS IplImage* cvTestSeqGetImage(CvTestSeq* pTestSeq);
12976acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
12986acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn/* Return frame size of result test video: */
12996acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RennCV_EXPORTS CvSize cvTestSeqGetImageSize(CvTestSeq* pTestSeq);
13006acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
13016acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn/* Return number of frames result test video: */
13026acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RennCV_EXPORTS int cvTestSeqFrameNum(CvTestSeq* pTestSeq);
13036acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
13046acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn/* Return number of existing objects.
13056acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn * This is general number of any objects.
13066acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn * For example number of trajectories may be equal or less than returned value:
13076acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn */
13086acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RennCV_EXPORTS int cvTestSeqGetObjectNum(CvTestSeq* pTestSeq);
13096acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
13106acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn/* Return 0 if there is not position for current defined on current frame */
13116acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn/* Return 1 if there is object position and pPos was filled */
13126acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RennCV_EXPORTS int cvTestSeqGetObjectPos(CvTestSeq* pTestSeq, int ObjIndex, CvPoint2D32f* pPos);
13136acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RennCV_EXPORTS int cvTestSeqGetObjectSize(CvTestSeq* pTestSeq, int ObjIndex, CvPoint2D32f* pSize);
13146acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
13156acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn/* Add noise to final image: */
13166acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RennCV_EXPORTS void cvTestSeqAddNoise(CvTestSeq* pTestSeq, int noise_type = CV_NOISE_NONE, double noise_ampl = 0);
13176acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
13186acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn/* Add Intensity variation: */
13196acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RennCV_EXPORTS void cvTestSeqAddIntensityVariation(CvTestSeq* pTestSeq, float DI_per_frame, float MinI, float MaxI);
13206acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RennCV_EXPORTS void cvTestSeqSetFrame(CvTestSeq* pTestSeq, int n);
13216acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
13226acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#endif
13236acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
13246acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn/* End of file. */
1325