!7 // The relationship between the white and the black part in a traditional // Haar-like feature could be much more general. Why do they have to // touch each other? Why do they need to have the same aspect ratio? // Only the area of both parts has to be the same. // // And even that could be lifted by applying a correction factor // (area white / area black). // // Finally, they can even overlap, then you'd use a factor of // (non-overlapping white area / non-overlapping black area). // // No idea if these would then be called "generalized Haar features" or what // // The general unit returned by a Haar match should be pixels*brightness // (value can be negative too). // // Result classification: // positive = match // 0 = non-match (indifferent/not applicable) // negative = anti-match (Haar feature should be inverted) srecord Haar(IIntegralImage img, DoubleRect rBlack, DoubleRect rWhite) { // We arbitrarily normalize to the non-overlapping white area double get() { DoubleRect overlapping = intersectDoubleRects(rBlack, rWhite); double overlapArea = area(overlapping); double blackArea = area(rBlack) - overlapArea; double whiteArea = area(rWhite) - overlapArea; ret img.pixelSum(rWhite) - img.pixelSum(rBlack); } }