removeRedEyes.cpp 1.9 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980
  1. /**
  2. Copyright 2017 by Satya Mallick ( Big Vision LLC )
  3. http://www.learnopencv.com
  4. **/
  5. #include <opencv2/opencv.hpp>
  6. using namespace std;
  7. using namespace cv;
  8. void fillHoles(Mat &mask)
  9. {
  10. /*
  11. This hole filling algorithm is decribed in this post
  12. https://www.learnopencv.com/filling-holes-in-an-image-using-opencv-python-c/
  13. */
  14. Mat maskFloodfill = mask.clone();
  15. floodFill(maskFloodfill, cv::Point(0,0), Scalar(255));
  16. Mat mask2;
  17. bitwise_not(maskFloodfill, mask2);
  18. mask = (mask2 | mask);
  19. }
  20. int main(int argc, char** argv )
  21. {
  22. // Read image
  23. Mat img = imread("red_eyes2.jpg", cv::IMREAD_COLOR);
  24. // Output image
  25. Mat imgOut = img.clone();
  26. // Load HAAR cascade
  27. CascadeClassifier eyesCascade("haarcascade_eye.xml");
  28. // Detect eyes
  29. std::vector<Rect> eyes;
  30. eyesCascade.detectMultiScale( img, eyes, 1.3, 4, 0 |CASCADE_SCALE_IMAGE, Size(100, 100) );
  31. // For every detected eye
  32. for( size_t i = 0; i < eyes.size(); i++ )
  33. {
  34. // Extract eye from the image.
  35. Mat eye = img(eyes[i]);
  36. // Split eye image into 3 channels.
  37. vector<Mat>bgr(3);
  38. split(eye,bgr);
  39. // Simple red eye detector
  40. Mat mask = (bgr[2] > 150) & (bgr[2] > ( bgr[1] + bgr[0] ));
  41. // Clean mask -- 1) File holes 2) Dilate (expand) mask
  42. fillHoles(mask);
  43. dilate(mask, mask, Mat(), Point(-1, -1), 3, 1, 1);
  44. // Calculate the mean channel by averaging
  45. // the green and blue channels
  46. Mat mean = (bgr[0]+bgr[1])/2;
  47. mean.copyTo(bgr[2], mask);
  48. mean.copyTo(bgr[0], mask);
  49. mean.copyTo(bgr[1], mask);
  50. // Merge channels
  51. Mat eyeOut;
  52. cv::merge(bgr,eyeOut);
  53. // Copy the fixed eye to the output image.
  54. eyeOut.copyTo(imgOut(eyes[i]));
  55. }
  56. // Display Result
  57. imshow("Red Eyes", img);
  58. imshow("Red Eyes Removed", imgOut);
  59. waitKey(0);
  60. }