Advertisement
Guest User

Untitled

a guest
Nov 19th, 2019
132
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 4.40 KB | None | 0 0
  1. void faceDetectAndDisplay(const string& window_name, Mat frame, int minFaceSize, int minEyeSize, vector<Rect> facess)
  2. {
  3. vector<Rect> faces;
  4. Mat frame_gray;
  5. cvtColor(frame, frame_gray, CV_BGR2GRAY);
  6. equalizeHist(frame_gray, frame_gray);
  7.  
  8. face_cascade.detectMultiScale(frame_gray, faces, 1.1, 2, 0 | CV_HAAR_SCALE_IMAGE, Size(minFaceSize, minFaceSize));
  9.  
  10. for (int i = 0; i < faces.size(); i++) {
  11. Point center(faces[i].x + faces[i].width*0.5, faces[i].y + faces[i].height*0.5);
  12.  
  13. ellipse(frame, center, Size(faces[i].width*0.5, faces[i].height*0.5), 0, 0,
  14. 360, Scalar(255, 0, 255), 4, 8, 0);
  15.  
  16. Mat faceROI = frame_gray(faces[i]);
  17. std::vector<Rect> eyes;
  18.  
  19. Rect eyes_rect;
  20.  
  21. eyes_rect.x = faces[i].x;
  22. eyes_rect.y = faces[i].y + 0.2 * faces[i].height;
  23. eyes_rect.width = faces[i].width;
  24. eyes_rect.height = faces[i].height * 0.35;
  25. Mat eyes_ROI = frame_gray(eyes_rect);
  26.  
  27. eyes_cascade.detectMultiScale(eyes_ROI, eyes, 1.1, 2, 0 | CV_HAAR_SCALE_IMAGE,
  28. Size(minEyeSize, minEyeSize));
  29.  
  30. for (int j = 0; j < eyes.size(); j++) {
  31. eyes[j].x = eyes[j].x + faces[i].x;
  32. eyes[j].y = eyes[j].y + faces[i].y + 0.2 * faces[i].height;
  33.  
  34. rectangle(frame, eyes[j], Scalar(255, 0, 0), 2, 8, 0);
  35.  
  36. }
  37.  
  38.  
  39. std::vector<Rect> nose;
  40.  
  41. Rect nose_rect;
  42. nose_rect.x = faces[i].x;
  43. nose_rect.y = faces[i].y + 0.4 * faces[i].height;
  44. nose_rect.width = faces[i].width;
  45. nose_rect.height = faces[i].height * 0.35;
  46. Mat nose_ROI = frame_gray(nose_rect);
  47. nose_cascade.detectMultiScale(nose_ROI, nose, 1.1, 2, 0 | CV_HAAR_SCALE_IMAGE, Size(minEyeSize, minEyeSize));
  48.  
  49. for (int j = 0; j < nose.size(); j++) {
  50. nose[j].x = nose[j].x + faces[i].x;
  51. nose[j].y = nose[j].y + faces[i].y + 0.4 * faces[i].height;
  52.  
  53. rectangle(frame, nose[j], Scalar(0, 255, 0), 2, 8, 0);
  54. }
  55.  
  56. std::vector<Rect> mouth;
  57. Rect mouth_rect;
  58. mouth_rect.x = faces[i].x;
  59. mouth_rect.y = faces[i].y + 0.7 * faces[i].height;
  60. mouth_rect.width = faces[i].width;
  61. mouth_rect.height = faces[i].height * 0.29;
  62. Mat mouth_ROI = frame_gray(mouth_rect);
  63. mouth_cascade.detectMultiScale(mouth_ROI, mouth, 1.1, 2, 0 | CV_HAAR_SCALE_IMAGE, Size(minEyeSize, minEyeSize));
  64.  
  65. for (int j = 0; j < mouth.size(); j++) {
  66. mouth[j].x = mouth[j].x + faces[i].x;
  67. mouth[j].y = mouth[j].y + faces[i].y + 0.7 * faces[i].height;
  68.  
  69. rectangle(frame, mouth[j], Scalar(0, 0, 255), 2, 8, 0);
  70. }
  71.  
  72. }
  73.  
  74. facess = faces;
  75. imshow(window_name, frame);
  76. }
  77.  
  78. void faceDetection()
  79. {
  80. Mat src, dst;
  81. vector<Rect> faces;
  82.  
  83. String face_cascade_name = "haarcascade_frontalface_alt.xml";
  84. String eyes_cascade_name = "haarcascade_eye_tree_eyeglasses.xml";
  85. String nose_cascade_name = "haarcascade_mcs_nose.xml";
  86. String mouth_cascade_name = "haarcascade_mcs_mouth.xml";
  87.  
  88. if (!face_cascade.load(face_cascade_name)) {
  89. printf("Error");
  90. return;
  91. }
  92. if (!eyes_cascade.load(eyes_cascade_name)) {
  93. printf("Error");
  94. return;
  95. }
  96. if (!nose_cascade.load(nose_cascade_name)) {
  97. printf("Error");
  98. return;
  99. }
  100. if (!mouth_cascade.load(mouth_cascade_name)) {
  101. printf("Error");
  102. return;
  103. }
  104.  
  105. char fname[MAX_PATH];
  106. while (openFileDlg(fname)) {
  107. src = imread(fname, CV_LOAD_IMAGE_COLOR);
  108. dst = src.clone();
  109. int minfaceSize = 30;
  110. int minEyeSize = minfaceSize / 5;
  111.  
  112. faceDetectAndDisplay("Dst", dst, minfaceSize, minEyeSize, faces);
  113. waitKey(0);
  114. }
  115. }
  116.  
  117. void FaceDetectionVideo()
  118. {
  119. Mat frame, crnt;
  120. Mat prev;
  121. Mat dst, gray;
  122. Mat flow;
  123. Mat backgnd, diff;
  124.  
  125. String face_cascade_name = "haarcascade_frontalface_alt.xml";
  126.  
  127. if (!face_cascade.load(face_cascade_name)) {
  128. printf("Error");
  129. return;
  130. }
  131.  
  132. char c;
  133. char fname[MAX_PATH];
  134. openFileDlg(fname);
  135. VideoCapture cap(fname);
  136.  
  137. double alpha = 0.05;
  138.  
  139. int frameNum = -1;
  140.  
  141. std::vector<Rect> faces;
  142.  
  143. for (; ;) {
  144. cap >> frame;
  145. crnt = frame.clone();
  146.  
  147. if (frame.empty()) {
  148. printf("END");
  149. break;
  150. }
  151.  
  152. ++frameNum;
  153.  
  154. if (frameNum > 0) {
  155. double t = (double)getTickCount();
  156. faceDetectAndDisplay("frame", frame, 30, 6, faces);
  157. /*Rect faceROI = faces[0];
  158. cvtColor(frame, gray, CV_BGR2GRAY);
  159. dst = gray.clone();
  160. absdiff(crnt, prev, diff);
  161. imshow("diff", diff);
  162. */
  163. t = ((double)getTickCount() - t) / getTickFrequency();
  164. printf("%d - %.3f [ms] \n", frameNum, t * 1000);
  165. }
  166.  
  167. c = cvWaitKey(0);
  168. //prev = crnt.clone();
  169.  
  170. if (c == 27) {
  171. printf("ESC pressed");
  172. break;
  173. }
  174. }
  175. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement