Sometimes to increase accuracy of face recognition algorithms it’s important to make sure the face is upright. For instance, in this image of Arnold, he is tilting his head, which may make it difficult to recognize him:
One way to pre-process this image is to rotate the it so the face is upright. The fastest way to do that is to find the eyes using a cascade classifier and then finding the angle between the eyes. This method AlignEyes will take an image and return one that is rotated upright:
public static Image<Gray, byte> AlignEyes(Image<Gray, byte> image) { Rectangle[] eyes = EyeClassifier.DetectMultiScale(image, 1.4, 0, new Size(1, 1), new Size(50, 50)); var unifiedEyes = CombineOverlappingRectangles(eyes).OrderBy(r => r.X).ToList(); if (unifiedEyes.Count == 2) { var deltaY = (unifiedEyes[1].Y + unifiedEyes[1].Height/2) - (unifiedEyes[0].Y + unifiedEyes[0].Height/2); var deltaX = (unifiedEyes[1].X + unifiedEyes[1].Width/2) - (unifiedEyes[0].X + unifiedEyes[0].Width/2); double degrees = Math.Atan2(deltaY, deltaX)*180/Math.PI; if (Math.Abs(degrees) < 35) { image = image.Rotate(-degrees, new Gray(0)); } } return image; }
EyeClassifier is a cascade classifier using the training file included with EmguCV called “haarcascade_eye_tree_eyeglasses.xml”. You can use whatever training you find works best.
And here is the result (the face has been cropped and masked in this image):
Your style is really unique compared to other people I have read stuff from.
Many thanks for posting when you’ve got the opportunity, Guess I will just book mark this
page.
Hi,
I was going through your code but i couldnt find any reference to the function you called CombineOverlappingRectangles
Could you please tell me where i can find the code for this function?
Regards
would please share your c# code function of CombineOverlappingRectangles?
would you please share the function CombineOverlappingRectangles?
thanks