There are pretty good results in one of the projects by identifying the eyes in the face with a nested cascade classifier, as it is in the delivered example. But then you can use an additional trick in which you have to turn down the minNeighbors parameter of nestedCascade.detectMultiScale() to 0.
That means you get a lot of results. One eye is recognized may times. Then you can check where the results are gathering on the left and the right part of the face. The gathering points are the actual eye positions.
Then you have to rotate the initial Image. Rotation-centre is the center of the face that you have found and rotation-angle is the angle between the detected eyes. Then you have to perform another face detection on the rotated image and make sure you use a very low scale-factor in the parameters of nestedCascade.detectMultiScale() for that.
The result is in most cases a perfectly normalized facial image. Of course, success still depends on how bad your lighting conditions are.
If you wish to learn about Artificial Intelligence then visit this Artificial Intelligence Course.