#include "opencv2\opencv.hpp"
using namespace cv;

int main()  // Ɩڂ̌oLp
{
  // ̌op
  CascadeClassifier face_cascade;
  // JXP[hEt@C̓Ǎ
  face_cascade.load("haarcascade_frontalface_default.xml");
  if (face_cascade.empty()) {
    return -1;
  }
  // ڂ̌op
  CascadeClassifier eye_cascade;
  eye_cascade.load("haarcascade_eye.xml");
  if (eye_cascade.empty()) {
    return -1;
  }
  // J[摜Ƃĉ摜̓Ǎ
  Mat frame = imread("frame.bmp", IMREAD_COLO  R);
  // J[O[XP[ϊ
  Mat gray;
  cvtColor(frame, gray, COLOR_BGR2GRAY);
  Mat beautyImage;
  // ̌
  vector<Rect> faces;
  face_cascade.detectMultiScale(gray, faces, 1.1, 3, 0, Size(50, 50));
  if (faces.size() > 0) {
    // oꍇ
    beautyImage = frame.clone();
    for (int f = 0; f < faces.size(); f++) {
      // ڂ̌o͈͈͂̔͂̏3/5̗̈ɐ
      Rect faceUpper = faces[f];
      faceUpper.height = faceUpper.height * 3 / 5;
      Mat faceGray = gray(faceUpper);
      // ̖̈ڂ
      vector<Rect> eyes;
      Rect eyeRect;
      // ڂ̌o
      eye_cascade.detectMultiScale(faceGray, eyes, 1.1, 3, 0, Size(5, 5));
      for (int i = 0; i < eyes.size(); i++) {
        // ̈̍W摜Ŝ̍Wɕϊ
        eyes[i] += Point(faces[f].x, faces[f].y);
        rectangle(frame, eyes[i], Scalar(0, 255, 0));
        // ڂ傫iڍׂ͌qj
        BigEye(beautyImage, eyes[i]);
        // ڂ傫鏈͂Q܂
        if (i == 1) break;
      }
      // iڍׂ͌qj
      BeautyFace(beautyImage, faces[f]);
      // ö̕`
      rectangle(frame, faces[f], Scalar(255, 0, 0));
      // ڂ̌opɎgp̈
      rectangle(frame, faceUpper, Scalar(255, 255, 0));
    }
  }
  // oʂ̕\
  cv::imshow("Face", frame);
  // L[͑҂
  waitKey(0);
  return 0;
}
