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// 126acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn// Copyright (C) 2000, Intel Corporation, all rights reserved. 136acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn// Third party copyrights are property of their respective owners. 146acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn// 156acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn// Redistribution and use in source and binary forms, with or without modification, 166acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn// are permitted provided that the following conditions are met: 176acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn// 186acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn// * Redistribution's of source code must retain the above copyright notice, 196acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn// this list of conditions and the following disclaimer. 206acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn// 216acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn// * Redistribution's in binary form must reproduce the above copyright notice, 226acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn// this list of conditions and the following disclaimer in the documentation 236acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn// and/or other materials provided with the distribution. 246acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn// 256acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn// * The name of Intel Corporation may not be used to endorse or promote products 266acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn// derived from this software without specific prior written permission. 276acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn// 286acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn// This software is provided by the copyright holders and contributors "as is" and 296acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn// any express or implied warranties, including, but not limited to, the implied 306acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn// warranties of merchantability and fitness for a particular purpose are disclaimed. 316acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn// In no event shall the Intel Corporation or contributors be liable for any direct, 326acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn// indirect, incidental, special, exemplary, or consequential damages 336acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn// (including, but not limited to, procurement of substitute goods or services; 346acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn// loss of use, data, or profits; or business interruption) however caused 356acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn// and on any theory of liability, whether in contract, strict liability, 366acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn// or tort (including negligence or otherwise) arising in any way out of 376acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn// the use of this software, even if advised of the possibility of such damage. 386acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn// 396acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn//M*/ 406acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 416acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#include "_cvaux.h" 426acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 436acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn// Function cvRefineForegroundMaskBySegm preforms FG post-processing based on segmentation 446acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn// (all pixels of the segment will be classified as FG if majority of pixels of the region are FG). 456acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn// parameters: 466acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn// segments - pointer to result of segmentation (for example MeanShiftSegmentation) 476acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn// bg_model - pointer to CvBGStatModel structure 486acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RennCV_IMPL void cvRefineForegroundMaskBySegm( CvSeq* segments, CvBGStatModel* bg_model ) 496acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn{ 506acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn IplImage* tmp_image = cvCreateImage(cvSize(bg_model->foreground->width,bg_model->foreground->height), 516acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn IPL_DEPTH_8U, 1); 526acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn for( ; segments; segments = ((CvSeq*)segments)->h_next ) 536acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn { 546acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn CvSeq seq = *segments; 556acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn seq.v_next = seq.h_next = NULL; 566acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn cvZero(tmp_image); 576acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn cvDrawContours( tmp_image, &seq, CV_RGB(0, 0, 255), CV_RGB(0, 0, 255), 10, -1); 586acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn int num1 = cvCountNonZero(tmp_image); 596acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn cvAnd(tmp_image, bg_model->foreground, tmp_image); 606acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn int num2 = cvCountNonZero(tmp_image); 616acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn if( num2 > num1*0.5 ) 626acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn cvDrawContours( bg_model->foreground, &seq, CV_RGB(0, 0, 255), CV_RGB(0, 0, 255), 10, -1); 636acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn else 646acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn cvDrawContours( bg_model->foreground, &seq, CV_RGB(0, 0, 0), CV_RGB(0, 0, 0), 10, -1); 656acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn } 666acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn cvReleaseImage(&tmp_image); 676acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn} 686acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 696acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 706acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 716acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RennCV_IMPL CvSeq* 726acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RenncvSegmentFGMask( CvArr* _mask, int poly1Hull0, float perimScale, 736acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn CvMemStorage* storage, CvPoint offset ) 746acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn{ 756acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn CvMat mstub, *mask = cvGetMat( _mask, &mstub ); 766acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn CvMemStorage* tempStorage = storage ? storage : cvCreateMemStorage(); 776acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn CvSeq *contours, *c; 786acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn int nContours = 0; 796acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn CvContourScanner scanner; 806acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 816acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn // clean up raw mask 826acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn cvMorphologyEx( mask, mask, 0, 0, CV_MOP_OPEN, 1 ); 836acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn cvMorphologyEx( mask, mask, 0, 0, CV_MOP_CLOSE, 1 ); 846acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 856acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn // find contours around only bigger regions 866acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn scanner = cvStartFindContours( mask, tempStorage, 876acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn sizeof(CvContour), CV_RETR_EXTERNAL, CV_CHAIN_APPROX_SIMPLE, offset ); 886acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 896acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn while( (c = cvFindNextContour( scanner )) != 0 ) 906acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn { 916acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn double len = cvContourPerimeter( c ); 926acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn double q = (mask->rows + mask->cols)/perimScale; // calculate perimeter len threshold 936acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn if( len < q ) //Get rid of blob if it's perimeter is too small 946acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn cvSubstituteContour( scanner, 0 ); 956acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn else //Smooth it's edges if it's large enough 966acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn { 976acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn CvSeq* newC; 986acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn if( poly1Hull0 ) //Polygonal approximation of the segmentation 996acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn newC = cvApproxPoly( c, sizeof(CvContour), tempStorage, CV_POLY_APPROX_DP, 2, 0 ); 1006acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn else //Convex Hull of the segmentation 1016acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn newC = cvConvexHull2( c, tempStorage, CV_CLOCKWISE, 1 ); 1026acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn cvSubstituteContour( scanner, newC ); 1036acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn nContours++; 1046acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn } 1056acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn } 1066acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn contours = cvEndFindContours( &scanner ); 1076acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 1086acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn // paint the found regions back into the image 1096acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn cvZero( mask ); 1106acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn for( c=contours; c != 0; c = c->h_next ) 1116acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn cvDrawContours( mask, c, cvScalarAll(255), cvScalarAll(0), -1, CV_FILLED, 8, 1126acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn cvPoint(-offset.x,-offset.y)); 1136acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 1146acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn if( tempStorage != storage ) 1156acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn { 1166acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn cvReleaseMemStorage( &tempStorage ); 1176acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn contours = 0; 1186acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn } 1196acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 1206acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn return contours; 1216acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn} 1226acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 1236acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn/* End of file. */ 1246acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 125