You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
135 lines
4.5 KiB
135 lines
4.5 KiB
/** @file */
|
|
/* The MIT License
|
|
*
|
|
* Copyright (c) 2008, Naotoshi Seo <sonots(at)sonots.com>
|
|
*
|
|
* Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
* of this software and associated documentation files (the "Software"), to deal
|
|
* in the Software without restriction, including without limitation the rights
|
|
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
* copies of the Software, and to permit persons to whom the Software is
|
|
* furnished to do so, subject to the following conditions:
|
|
*
|
|
* The above copyright notice and this permission notice shall be included in
|
|
* all copies or substantial portions of the Software.
|
|
*
|
|
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
|
* THE SOFTWARE.
|
|
*/
|
|
#ifndef CV_BACKGROUND_INCLUDED
|
|
#define CV_BACKGROUND_INCLUDED
|
|
|
|
#include "cv.h"
|
|
#include "cvaux.h"
|
|
#include "cxcore.h"
|
|
|
|
/**
|
|
* Obtain non-background pixels using reference image (such as previous frame in video )
|
|
*
|
|
* @param _img The target image
|
|
* @param _ref The reference image. Usually the previous frame of video
|
|
* @param _mask The generated mask image where 0 is for bg and 1 is for non-bg.
|
|
* Must be 8U and 1 channel
|
|
* @param thresh The threshold. [0 - 255^2] for single channel image.
|
|
* [0 - 255^2 * 3] for 3 channel image.
|
|
* @return
|
|
*/
|
|
CVAPI(void) cvBackground( const IplImage* _img,
|
|
const IplImage* _ref,
|
|
IplImage* _mask,
|
|
int thresh CV_DEFAULT(100) )
|
|
{
|
|
IplImage *img;
|
|
IplImage *ref;
|
|
IplImage *mask;
|
|
CV_FUNCNAME( "cvBackground" ); // error handling
|
|
__CV_BEGIN__;
|
|
CV_ASSERT( _img->width == _ref->width );
|
|
CV_ASSERT( _img->width == _mask->width );
|
|
CV_ASSERT( _img->height == _ref->height );
|
|
CV_ASSERT( _img->height == _ref->height );
|
|
CV_ASSERT( _img->nChannels == _ref->nChannels );
|
|
CV_ASSERT( _mask->nChannels == 1 );
|
|
CV_ASSERT( _mask->depth == IPL_DEPTH_8U );
|
|
|
|
img = cvCreateImage( cvGetSize(_img), IPL_DEPTH_32F, _img->nChannels );
|
|
ref = cvCreateImage( cvGetSize(_img), IPL_DEPTH_32F, _img->nChannels );
|
|
mask = cvCreateImage( cvGetSize(_img), IPL_DEPTH_32F, 1 );
|
|
cvConvert( _img, img );
|
|
cvConvert( _ref, ref );
|
|
cvSub( img, ref, img );
|
|
cvMul( img, img, img ); // square
|
|
|
|
if( img->nChannels > 1 )
|
|
{
|
|
IplImage* imgB = cvCreateImage( cvGetSize(img), img->depth, 1 );
|
|
IplImage* imgG = cvCreateImage( cvGetSize(img), img->depth, 1 );
|
|
IplImage* imgR = cvCreateImage( cvGetSize(img), img->depth, 1 );
|
|
cvSplit( img, imgB, imgG, imgR, NULL );
|
|
cvAdd( imgB, imgG, mask );
|
|
cvAdd( mask, imgR, mask );
|
|
cvReleaseImage( &imgB );
|
|
cvReleaseImage( &imgG );
|
|
cvReleaseImage( &imgR );
|
|
}
|
|
else
|
|
{
|
|
cvCopy( img, mask );
|
|
}
|
|
cvThreshold( mask, _mask, thresh, 1, CV_THRESH_BINARY );
|
|
|
|
cvReleaseImage( &img );
|
|
cvReleaseImage( &ref );
|
|
cvReleaseImage( &mask );
|
|
__CV_END__;
|
|
}
|
|
|
|
/*
|
|
//this is a sample for foreground detection functions
|
|
//this is not training, but using pre-determined params
|
|
//See cvCreateGaussainBGModel in ./cvaux/src/cvbgfg_gaussmix.cpp
|
|
//This is setting paramets such as CV_BGFG_MOG_BACKGROUND_THRESHOLD (cvaux.h)
|
|
//cvUpdateBGStatModel means just setting bg_model->foreground, background
|
|
int main(int argc, char** argv)
|
|
{
|
|
IplImage* tmp_frame = NULL;
|
|
CvCapture* video = NULL;
|
|
|
|
video = cvCaptureFromFile(argv[1]);
|
|
tmp_frame = cvQueryFrame(video);
|
|
if(!tmp_frame)
|
|
{
|
|
printf("bad video \n");
|
|
exit(0);
|
|
}
|
|
|
|
cvNamedWindow("BG", 1);
|
|
cvNamedWindow("FG", 1);
|
|
|
|
//create BG model
|
|
CvBGStatModel* bg_model = cvCreateGaussianBGModel( tmp_frame );
|
|
|
|
for( int fr = 1;tmp_frame; tmp_frame = cvQueryFrame(video), fr++ )
|
|
{
|
|
cvUpdateBGStatModel( tmp_frame, bg_model );
|
|
cvShowImage("BG", bg_model->background);
|
|
cvShowImage("FG", bg_model->foreground);
|
|
int k = cvWaitKey(5);
|
|
if( k == 27 ) break;
|
|
//printf("frame# %d \r", fr);
|
|
}
|
|
|
|
|
|
cvReleaseBGStatModel( &bg_model );
|
|
cvReleaseCapture(&video);
|
|
|
|
return 0;
|
|
}*/
|
|
|
|
#endif
|