/// <summary> /// Gets the sum of the areas of the rectangular features in an integral image. /// </summary> /// public double GetSum(IntegralImage2 image, int x, int y) { double sum = 0.0; if (!Tilted) { // Compute the sum for a standard feature foreach (HaarRectangle rect in Rectangles) { sum += image.GetSum(x + rect.ScaledX, y + rect.ScaledY, rect.ScaledWidth, rect.ScaledHeight) * rect.ScaledWeight; } } else { // Compute the sum for a rotated feature foreach (HaarRectangle rect in Rectangles) { sum += image.GetSumT(x + rect.ScaledX, y + rect.ScaledY, rect.ScaledWidth, rect.ScaledHeight) * rect.ScaledWeight; } } return(sum); }
/// <summary> /// Detects the presence of an object in a given window. /// </summary> /// public bool Compute(IntegralImage2 image, Rectangle rectangle) { int x = rectangle.X; int y = rectangle.Y; int w = rectangle.Width; int h = rectangle.Height; double mean = image.GetSum(x, y, w, h) * invArea; double var = image.GetSum2(x, y, w, h) * invArea - (mean * mean); double sdev = (var >= 0) ? Math.Sqrt(var) : 1; // For each classification stage in the cascade foreach (HaarCascadeStage stage in cascade.Stages) { // Check if the stage has rejected the image if (stage.Classify(image, x, y, sdev) == false) { return(false); // The image has been rejected. } } // If the object has gone all stages and has not // been rejected, the object has been detected. return(true); // The image has been detected. }
public void lena_test() { string localPath = NUnit.Framework.TestContext.CurrentContext.TestDirectory; #region doc_lena // In this example, we will compute an integral image // representation of Lena Söderberg's famous picture: TestImages testImages = new TestImages(path: localPath); Bitmap lena = testImages["lena.bmp"]; // get the image // Create a new Integral Image (squared and tilted) from Lena's picture: IntegralImage2 ii = IntegralImage2.FromBitmap(lena, computeTilted: true); // Let's say we would like to get the summed area in the rectangular region // delimited by pixel (34, 50) until pixels (60, 105). This is equivalent to // the region under the rectangle (34, 50, 34+60, 50+105) = (34, 50, 94, 155): long sum = ii.GetSum(34, 50, 94, 155); // this is the sum of values (1760032) // Now let's say we would like to get the squared sum and tilted sum as well: long ssum = ii.GetSum2(34, 50, 94, 155); // this is the sum of squared values (229508896) long tsum = ii.GetSumT(34, 50, 94, 155); // this is the sum of tilted values (-593600) #endregion Assert.AreEqual(1760032, sum); Assert.AreEqual(229508896, ssum); Assert.AreEqual(-593600, tsum); }
public void GetSumTest() { byte[,] img = { { 01, 02, 03, 04, 05, 06, 07, 08, 09, 10 }, { 11, 12, 13, 14, 15, 16, 17, 18, 19, 20 }, { 21, 22, 23, 24, 25, 26, 27, 28, 29, 30 }, { 31, 32, 33, 34, 35, 36, 37, 38, 39, 40 }, { 41, 42, 43, 44, 45, 46, 47, 48, 49, 50 }, { 51, 52, 53, 54, 55, 56, 57, 58, 59, 60 }, { 61, 62, 63, 64, 65, 66, 67, 68, 69, 70 }, { 71, 72, 73, 74, 75, 76, 77, 78, 79, 80 }, { 81, 82, 83, 84, 85, 86, 87, 88, 89, 90 }, { 91, 92, 93, 94, 95, 96, 97, 98, 99, 100 } }; // Create integral image Bitmap bmp = Accord.Imaging.Tools.ToBitmap(img); IntegralImage2 ii = IntegralImage2.FromBitmap(bmp, 0, true); // Horizontal rectangular feature int x = 6, y = 0, w = 3, h = 2; int expected = 7 + 8 + 9 + 17 + 18 + 19; long actual = ii.GetSum(x, y, w, h); Assert.AreEqual(expected, actual); }
/// <summary> /// Gets the sum of the areas of the rectangular features in an integral image. /// </summary> /// public double GetSum(IntegralImage2 image, int x, int y) { double sum = 0.0; if (!Tilted) { // Compute the sum for a standard feature foreach (HaarRectangle rect in Rectangles) { sum += image.GetSum(x + rect.ScaledX, y + rect.ScaledY, rect.ScaledWidth, rect.ScaledHeight) * rect.ScaledWeight; } } else { // Compute the sum for a rotated feature foreach (HaarRectangle rect in Rectangles) { sum += image.GetSumT(x + rect.ScaledX, y + rect.ScaledY, rect.ScaledWidth, rect.ScaledHeight) * rect.ScaledWeight; } } return sum; }