int cluster_detections(int a[], int rs[], int cs[], int ss[], int qs[], int n) { int ncc, cc, idx; // ncc = find_connected_components(a, rs, cs, ss, n); if(!ncc) return 0; // idx = 0; for(cc=1; cc<=ncc; ++cc) { int i, k; int sumrs=0, sumcs=0, sumss=0, sumqs=0; // k = 0; for(i=0; i<n; ++i) if(a[i] == cc) { sumrs += rs[i]; sumcs += cs[i]; sumss += ss[i]; sumqs += qs[i]; ++k; } ///for(i=0; i<n; ++i) /// if(a[i] == cc) /// qs[i] = sumqs; // qs[idx] = sumqs; // accumulated confidence measure // rs[idx] = sumrs/k; cs[idx] = sumcs/k; ss[idx] = sumss/k; // ++idx; } // return idx; }
static GstFlowReturn gst_segmentation_transform_ip (GstVideoFilter * btrans, GstVideoFrame * frame) { GstSegmentation *filter = GST_SEGMENTATION (btrans); int j; /* get image data from the input, which is RGBA */ filter->cvRGBA->imageData = (char *) GST_VIDEO_FRAME_COMP_DATA (frame, 0); filter->cvRGBA->widthStep = GST_VIDEO_FRAME_COMP_STRIDE (frame, 0); filter->framecount++; /* Image preprocessing: color space conversion etc */ cvCvtColor (filter->cvRGBA, filter->cvRGB, CV_RGBA2RGB); cvCvtColor (filter->cvRGB, filter->cvYUV, CV_RGB2YCrCb); /* Create and update a fg/bg model using a codebook approach following the * opencv O'Reilly book [1] implementation of the algo described in [2]. * * [1] Learning OpenCV: Computer Vision with the OpenCV Library by Gary * Bradski and Adrian Kaehler, Published by O'Reilly Media, October 3, 2008 * [2] "Real-time Foreground-Background Segmentation using Codebook Model", * Real-time Imaging, Volume 11, Issue 3, Pages 167-256, June 2005. */ if (METHOD_BOOK == filter->method) { unsigned cbBounds[3] = { 10, 5, 5 }; int minMod[3] = { 20, 20, 20 }, maxMod[3] = { 20, 20, 20}; if (filter->framecount < 30) { /* Learning background phase: update_codebook on every frame */ for (j = 0; j < filter->width * filter->height; j++) { update_codebook ((unsigned char *) filter->cvYUV->imageData + j * 3, (codeBook *) & (filter->TcodeBook[j]), cbBounds, 3); } } else { /* this updating is responsible for FG becoming BG again */ if (filter->framecount % filter->learning_interval == 0) { for (j = 0; j < filter->width * filter->height; j++) { update_codebook ((uchar *) filter->cvYUV->imageData + j * 3, (codeBook *) & (filter->TcodeBook[j]), cbBounds, 3); } } if (filter->framecount % 60 == 0) { for (j = 0; j < filter->width * filter->height; j++) clear_stale_entries ((codeBook *) & (filter->TcodeBook[j])); } for (j = 0; j < filter->width * filter->height; j++) { if (background_diff ((uchar *) filter->cvYUV->imageData + j * 3, (codeBook *) & (filter->TcodeBook[j]), 3, minMod, maxMod)) { filter->cvFG->imageData[j] = 255; } else { filter->cvFG->imageData[j] = 0; } } } /* 3rd param is the smallest area to show: (w+h)/param , in pixels */ find_connected_components (filter->cvFG, 1, 10000, filter->mem_storage, filter->contours); } /* Create the foreground and background masks using BackgroundSubtractorMOG [1], * Gaussian Mixture-based Background/Foreground segmentation algorithm. OpenCV * MOG implements the algorithm described in [2]. * * [1] http://opencv.itseez.com/modules/video/doc/motion_analysis_and_object_tracking.html#backgroundsubtractormog * [2] P. KadewTraKuPong and R. Bowden, "An improved adaptive background * mixture model for real-time tracking with shadow detection", Proc. 2nd * European Workshop on Advanced Video-Based Surveillance Systems, 2001 */ else if (METHOD_MOG == filter->method) { run_mog_iteration (filter); } /* Create the foreground and background masks using BackgroundSubtractorMOG2 * [1], Gaussian Mixture-based Background/Foreground segmentation algorithm. * OpenCV MOG2 implements the algorithm described in [2] and [3]. * * [1] http://opencv.itseez.com/modules/video/doc/motion_analysis_and_object_tracking.html#backgroundsubtractormog2 * [2] Z.Zivkovic, "Improved adaptive Gausian mixture model for background * subtraction", International Conference Pattern Recognition, UK, Aug 2004. * [3] Z.Zivkovic, F. van der Heijden, "Efficient Adaptive Density Estimation * per Image Pixel for the Task of Background Subtraction", Pattern * Recognition Letters, vol. 27, no. 7, pages 773-780, 2006. */ else if (METHOD_MOG2 == filter->method) { run_mog2_iteration (filter); } /* if we want to test_mode, just overwrite the output */ if (filter->test_mode) { cvCvtColor (filter->cvFG, filter->cvRGB, CV_GRAY2RGB); cvSplit (filter->cvRGB, filter->ch1, filter->ch2, filter->ch3, NULL); } else cvSplit (filter->cvRGBA, filter->ch1, filter->ch2, filter->ch3, NULL); /* copy anyhow the fg/bg to the alpha channel in the output image */ cvMerge (filter->ch1, filter->ch2, filter->ch3, filter->cvFG, filter->cvRGBA); return GST_FLOW_OK; }