Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- void faceDetectAndDisplay(const string& window_name, Mat frame, int minFaceSize, int minEyeSize, vector<Rect> facess)
- {
- vector<Rect> faces;
- Mat frame_gray;
- cvtColor(frame, frame_gray, CV_BGR2GRAY);
- equalizeHist(frame_gray, frame_gray);
- face_cascade.detectMultiScale(frame_gray, faces, 1.1, 2, 0 | CV_HAAR_SCALE_IMAGE, Size(minFaceSize, minFaceSize));
- for (int i = 0; i < faces.size(); i++) {
- Point center(faces[i].x + faces[i].width*0.5, faces[i].y + faces[i].height*0.5);
- ellipse(frame, center, Size(faces[i].width*0.5, faces[i].height*0.5), 0, 0,
- 360, Scalar(255, 0, 255), 4, 8, 0);
- Mat faceROI = frame_gray(faces[i]);
- std::vector<Rect> eyes;
- Rect eyes_rect;
- eyes_rect.x = faces[i].x;
- eyes_rect.y = faces[i].y + 0.2 * faces[i].height;
- eyes_rect.width = faces[i].width;
- eyes_rect.height = faces[i].height * 0.35;
- Mat eyes_ROI = frame_gray(eyes_rect);
- eyes_cascade.detectMultiScale(eyes_ROI, eyes, 1.1, 2, 0 | CV_HAAR_SCALE_IMAGE,
- Size(minEyeSize, minEyeSize));
- for (int j = 0; j < eyes.size(); j++) {
- eyes[j].x = eyes[j].x + faces[i].x;
- eyes[j].y = eyes[j].y + faces[i].y + 0.2 * faces[i].height;
- rectangle(frame, eyes[j], Scalar(255, 0, 0), 2, 8, 0);
- }
- std::vector<Rect> nose;
- Rect nose_rect;
- nose_rect.x = faces[i].x;
- nose_rect.y = faces[i].y + 0.4 * faces[i].height;
- nose_rect.width = faces[i].width;
- nose_rect.height = faces[i].height * 0.35;
- Mat nose_ROI = frame_gray(nose_rect);
- nose_cascade.detectMultiScale(nose_ROI, nose, 1.1, 2, 0 | CV_HAAR_SCALE_IMAGE, Size(minEyeSize, minEyeSize));
- for (int j = 0; j < nose.size(); j++) {
- nose[j].x = nose[j].x + faces[i].x;
- nose[j].y = nose[j].y + faces[i].y + 0.4 * faces[i].height;
- rectangle(frame, nose[j], Scalar(0, 255, 0), 2, 8, 0);
- }
- std::vector<Rect> mouth;
- Rect mouth_rect;
- mouth_rect.x = faces[i].x;
- mouth_rect.y = faces[i].y + 0.7 * faces[i].height;
- mouth_rect.width = faces[i].width;
- mouth_rect.height = faces[i].height * 0.29;
- Mat mouth_ROI = frame_gray(mouth_rect);
- mouth_cascade.detectMultiScale(mouth_ROI, mouth, 1.1, 2, 0 | CV_HAAR_SCALE_IMAGE, Size(minEyeSize, minEyeSize));
- for (int j = 0; j < mouth.size(); j++) {
- mouth[j].x = mouth[j].x + faces[i].x;
- mouth[j].y = mouth[j].y + faces[i].y + 0.7 * faces[i].height;
- rectangle(frame, mouth[j], Scalar(0, 0, 255), 2, 8, 0);
- }
- }
- facess = faces;
- imshow(window_name, frame);
- }
- void faceDetection()
- {
- Mat src, dst;
- vector<Rect> faces;
- String face_cascade_name = "haarcascade_frontalface_alt.xml";
- String eyes_cascade_name = "haarcascade_eye_tree_eyeglasses.xml";
- String nose_cascade_name = "haarcascade_mcs_nose.xml";
- String mouth_cascade_name = "haarcascade_mcs_mouth.xml";
- if (!face_cascade.load(face_cascade_name)) {
- printf("Error");
- return;
- }
- if (!eyes_cascade.load(eyes_cascade_name)) {
- printf("Error");
- return;
- }
- if (!nose_cascade.load(nose_cascade_name)) {
- printf("Error");
- return;
- }
- if (!mouth_cascade.load(mouth_cascade_name)) {
- printf("Error");
- return;
- }
- char fname[MAX_PATH];
- while (openFileDlg(fname)) {
- src = imread(fname, CV_LOAD_IMAGE_COLOR);
- dst = src.clone();
- int minfaceSize = 30;
- int minEyeSize = minfaceSize / 5;
- faceDetectAndDisplay("Dst", dst, minfaceSize, minEyeSize, faces);
- waitKey(0);
- }
- }
- void FaceDetectionVideo()
- {
- Mat frame, crnt;
- Mat prev;
- Mat dst, gray;
- Mat flow;
- Mat backgnd, diff;
- String face_cascade_name = "haarcascade_frontalface_alt.xml";
- if (!face_cascade.load(face_cascade_name)) {
- printf("Error");
- return;
- }
- char c;
- char fname[MAX_PATH];
- openFileDlg(fname);
- VideoCapture cap(fname);
- double alpha = 0.05;
- int frameNum = -1;
- std::vector<Rect> faces;
- for (; ;) {
- cap >> frame;
- crnt = frame.clone();
- if (frame.empty()) {
- printf("END");
- break;
- }
- ++frameNum;
- if (frameNum > 0) {
- double t = (double)getTickCount();
- faceDetectAndDisplay("frame", frame, 30, 6, faces);
- /*Rect faceROI = faces[0];
- cvtColor(frame, gray, CV_BGR2GRAY);
- dst = gray.clone();
- absdiff(crnt, prev, diff);
- imshow("diff", diff);
- */
- t = ((double)getTickCount() - t) / getTickFrequency();
- printf("%d - %.3f [ms] \n", frameNum, t * 1000);
- }
- c = cvWaitKey(0);
- //prev = crnt.clone();
- if (c == 27) {
- printf("ESC pressed");
- break;
- }
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement