Intel® Integrated Performance Primitives (Intel® IPP) Developer Guide and Reference

ID 790148
Date 3/22/2024
Public
Document Table of Contents

FGMMBackground

Returns the updated background image.

Syntax

IppStatus ippiFGMMBackground_8u_C3R(Ipp8u* pDst, int dstStep, IppiSize roi, IppFGMMState_8u_C3R* pState);

Include Files

ippcv.h

Domain Dependencies

Headers: ippcore.h, ippvm.h, ipps.h, ippi.h

Libraries: ippcore.lib, ippvm.lib, ipps.lib, ippi.lib

Parameters

pDst
Pointer to the three-channel background image.
dstStep
Distance, in bytes, between the starting points of consecutive lines in the destination image.
roi
Size of the source image ROI, in pixels.
pState
Pointer to the IppFGMMState_8u_C3R state structure.

Description

This function implements the Gaussian mixture model background subtraction described in [ZIVKOVIC04]. The function returns the three-channel Ipp8u background image.

Before using this function, you need to compute the size of the IppFGMMState_8u_C3R state structure and initialize the structure using the FGMMGetBufferSize and FGMMInit functions, respectively.

Return Values

ippStsNoErr

Indicates no error.

ippStsNullPtrErr

Indicates an error when pDst or pState is NULL.

ippStsSizeErr

Indicates an error when roi is less than, or equal to zero.

ippStsStepErr

Indicates an error when dstStep is less than, or equal to zero.

Example

/*******************************************************************************
* Copyright 2015 Intel Corporation.
*
*
* This software and the related documents are Intel copyrighted materials, and your use of them is governed by
* the express license under which they were provided to you ('License'). Unless the License provides otherwise,
* you may not use, modify, copy, publish, distribute, disclose or transmit this software or the related
* documents without Intel's prior written permission.
* This software and the related documents are provided as is, with no express or implied warranties, other than
* those that are expressly stated in the License.
*******************************************************************************/

// A simple example of image foreground/background segmentation
// using Intel(R) Integrated Performance Primitives (Intel(R) IPP) functions:
//     ippiFGMMGetBufferSize_8u_C3R
//     ippiFGMMInit_8u_C3R
//     ippiFGMMForeground_8u_C3R
//     ippiFGMMBackground_8u_C3R


#include <stdio.h>
#include "ipp.h"

#define WIDTH  32      /* image width  */
#define HEIGHT 32      /* image height */
#define NUM_FRAME 100
#define MAX_N_RECT 3   /* number of rectangles */

static struct {
    int x;
    int y;
    int w;
    int h;
    int dx;
    int dy;
    Ipp8u color[3];
} rect[MAX_N_RECT];  /* Parameters of rectangle */

/* Next two defines are created to simplify code reading and understanding */
#define EXIT_MAIN exitLine:                                  /* Label for Exit */
#define check_sts(st) if((st) != ippStsNoErr) goto exitLine; /* Go to Exit if Intel(R) IPP function returned status different from ippStsNoErr */

/* Results of ippMalloc() are not validated because Intel(R) IPP functions perform bad arguments check and will return an appropriate status  */

int main(void)
{
    int r = 0, frame = 0;
    IppStatus status = ippStsNoErr;
    Ipp8u* pSrc = NULL, *pDstF = NULL, *pDstB = NULL; /* Pointers to source/foreground/background images */
    int srcStep = 0, dstFStep = 0, dstBStep = 0;      /* Steps, in bytes, through the source/foreground/background images */
    IppiSize roiSize = { WIDTH, HEIGHT }; /* Size of source ROI in pixels */
    int specSize = 0;                     /* Size of the working buffer and spec structure */
    IppFGMMState_8u_C3R*  pState = NULL;  /* Pointer to the state */
    IppFGMModel           pModel = {0};   /* Pointer to the parameters structure */
    Ipp8u value[3] = {0,0,0};
    int maxNGauss = 5; /* Maximum number of allowed Gaussians */

    pSrc  = ippiMalloc_8u_C3(roiSize.width, roiSize.height, &srcStep);
    pDstF = ippiMalloc_8u_C1(roiSize.width, roiSize.height, &dstFStep);
    pDstB = ippiMalloc_8u_C3(roiSize.width, roiSize.height, &dstBStep);

    check_sts( status = ippiFGMMGetBufferSize_8u_C3R(roiSize, maxNGauss, &specSize) )

    pState = (IppFGMMState_8u_C3R*)ippsMalloc_8u(specSize);

    pModel.numFrames = 50;
    pModel.varInit = 15.0;
    pModel.varMin = 4.0;
    pModel.varMax = 75.0;
    pModel.varWBRatio = 4.0f*4.0f;
    pModel.bckgThr = 0.9f;
    pModel.varNGRatio = 3.0f*3.0f;
    pModel.reduction = 0.05f;
    pModel.shadowValue = 127;
    pModel.shadowFlag = 1;
    pModel.shadowRatio = 0.5;
    pModel.maxNGauss = maxNGauss;

    check_sts( status = ippiFGMMInit_8u_C3R(roiSize, maxNGauss, &pModel, pState) )

    for (r = 0; r<MAX_N_RECT; r++)
    {
        rect[r].x = 0;
        rect[r].y = 0;
        rect[r].w = 10 + r;
        rect[r].h = 5 + r;
        rect[r].dx = 1;
        rect[r].dy = 1;
        rect[r].color[0] = (Ipp8u)(10 * r);
        rect[r].color[1] = (Ipp8u)(20 * r);
        rect[r].color[2] = (Ipp8u)( 3 * r);
    }
    for (frame = 0; frame < NUM_FRAME; frame++)
    {
        Ipp8u valueRect[3] = { 0, 0, 0 };
        IppiSize roiRectSize = {0};
        /* Draw rectangle to simulate moving object */
        check_sts( status = ippiSet_8u_C3R(value, pSrc, srcStep, roiSize) ) /* zero image */

        for (r = 0; r<MAX_N_RECT; r++)
        {
            valueRect[0] = (Ipp8u)(rect[r].color[0] + frame);
            valueRect[1] = (Ipp8u)(rect[r].color[1] + frame);
            valueRect[2] = (Ipp8u)(rect[r].color[2] + frame);
            roiRectSize.width  = rect[r].w;
            roiRectSize.height = rect[r].h;
            check_sts( status = ippiSet_8u_C3R(valueRect, pSrc + srcStep*rect[r].y + 3 * rect[r].x, srcStep, roiRectSize) )
            if (status<0) break;

            if (rect[r].x + rect[r].w >= roiSize.width){
                rect[r].dx = -1;
            }
            else if (rect[r].x <= 0){
                rect[r].dx = 1;
            }
            if (rect[r].y + rect[r].h >= roiSize.height){
                rect[r].dy = -1;
            }
            else if (rect[r].y == 0){
                rect[r].dy = 1;
            }
            rect[r].x += rect[r].dx;
            rect[r].y += rect[r].dy;
        }
        check_sts( status = ippiFGMMForeground_8u_C3R(pSrc, srcStep, pDstF, dstFStep, roiSize, pState, &pModel, -1) )

        check_sts( status = ippiFGMMBackground_8u_C3R(pDstB, dstBStep, roiSize, pState) )
    }

EXIT_MAIN
    ippiFree(pSrc);
    ippiFree(pDstF);
    ippiFree(pDstB);
    printf("Exit status %d (%s)\n", (int)status, ippGetStatusString(status));
    return (int)status;
}

See Also