/// <summary> /// Executes classification algorithm, after running the method you will have /// a collection containing classified blobs. /// </summary> /// <param name="blobs">The blobs to classify.</param> /// <returns> /// A collection containing classified blobs.Collection size will be equal to blobs argument. /// </returns> public ICollection <ExtendedBlob> execute(ICollection <ExtendedBlob> blobs) { // Iterate over blobs and apply criteria. foreach (ExtendedBlob singleBlob in blobs) { Rectangle r = singleBlob.Rectangle; float ration = r.Height / r.Width; int size = r.Height * r.Width; if (size <= 25) { singleBlob.Class = Junk.GetInstance(); } else if (size < 500) // Size criteria. { singleBlob.Class = Unknown.GetInstance(); } // else if (ration > 5 && ration < 4) // Ratio criteria. // { // singleBlob.Class = ExtendedBlob.BlobClass.Unknown; // } else { singleBlob.Class = Person.GetInstance(); } } return(blobs); }
/// <summary> /// Merges blobs that are close to each other. /// </summary> /// <param name="value">The blobs found after running connected componenets algorithm.</param> /// <returns></returns> // private ArrayList<ExtendedBlob> mergeBlobs(ArrayList<ExtendedBlob> value) // { // /* // * Using a very simple methology of merging. // * Search all blobs that in close proximity of x pixels. // */ // ICollection<ExtendedBlob> intermediateValues = // new ArrayList<ExtendedBlob>(value.Count); // int x = 10; // ExtendedBlob closeToMe = value.RemoveAt(0); // while(!value.IsEmpty) // { // for (int i = 0; i < value.Count; i++) // { // Rectangle mergeRectangle = closeToMe.Rectangle; // mergeRectangle.Width += x; // mergeRectangle.Height += x; // if (mergeRectangle.IntersectsWith(value[i].Rectangle)) // { // // closeToMe // intermediateValues.Add(value[i]); // } // } // } // // } /// <summary> /// Runs the conected components algorithm. /// </summary> /// <param name="image">The image on which to run the algorithms.</param> /// <returns></returns> private List <ExtendedBlob> runConectedComponentsAlgorithm(Bitmap image) { blobCounter = new BlobCounter(image); Blob[] blobs = blobCounter.GetObjects(image); Rectangle[] rects = blobCounter.GetObjectRectangles(); List <ExtendedBlob> returnValue = new List <ExtendedBlob>(blobs.Length); for (int i = 0; i < blobs.Length; i++) { // Use adapter method and convert blobs to extended blobs. returnValue.Add(new ExtendedBlob(blobs[i], null, Unknown.GetInstance(), rects[i])); } return(returnValue); }