Advertisement
Guest User

Untitled

a guest
Jun 24th, 2017
59
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 4.73 KB | None | 0 0
  1. #include <opencv/cv.h>
  2. #include <opencv/highgui.h>
  3.  
  4. void detectObj(const char *cascade_name, IplImage *img, IplImage *gImg, CvMemStorage *storage, int maxcount)
  5. {
  6. CvHaarClassifierCascade *cascade = 0;
  7. CvSeq *seq;
  8. int i;
  9. static CvScalar colors[] = {
  10. {{0, 0, 255}}, {{0, 128, 255}},
  11. {{0, 255, 255}}, {{0, 255, 0}},
  12. {{255, 128, 0}}, {{255, 255, 0}},
  13. {{255, 0, 0}}, {{255, 0, 255}}
  14. };
  15.  
  16. cascade = (CvHaarClassifierCascade *)cvLoad(cascade_name, 0, 0, 0);
  17. printf("find objects..."); fflush(stdout);
  18. seq = cvHaarDetectObjects(gImg, cascade, storage, 2.0, 4, 0, cvSize(40,40));
  19. printf("...done");
  20. for (i = 0; i < (seq ? seq->total : 0) && i < maxcount; i++) {
  21. CvRect *r = (CvRect *) cvGetSeqElem (seq, i);
  22. CvPoint center;
  23. int radius;
  24. center.x = cvRound (r->x + r->width * 0.5);
  25. center.y = cvRound (r->y + r->height * 0.5);
  26. radius = cvRound ((r->width + r->height) * 0.25);
  27. cvCircle (img, center, radius, colors[i % 8], 3, 8, 0);
  28. }
  29. }
  30.  
  31. int main(int argc, char** argv)
  32. {
  33. CvHaarClassifierCascade *cascade = 0;
  34. CvSeq *seq;
  35. IplImage *src_img = 0, *src_gray = 0;
  36. CvMemStorage *storage = 0;
  37. CvRect* face_rect;
  38. CvRect upper_half;
  39. CvRect lower_half;
  40.  
  41. //Cascades
  42. const char *face_cascade = "/usr/local/share/OpenCV/haarcascades/haarcascade_frontalface_alt2.xml";
  43. const char *eye_cascade = "/usr/local/share/OpenCV/haarcascades/haarcascade_eye.xml";
  44. const char *nose_cascade = "/usr/local/share/OpenCV/haarcascades/haarcascade_mcs_nose.xml";
  45. const char *mouth_cascade = "/usr/local/share/OpenCV/haarcascades/haarcascade_mcs_mouth.xml";
  46.  
  47. //Read ImageFile
  48. if (argc < 2 || (src_img = cvLoadImage(argv[1], CV_LOAD_IMAGE_COLOR)) == 0)
  49. return -1;
  50. src_gray = cvCreateImage(cvGetSize(src_img), IPL_DEPTH_8U, 1);
  51. //GrayScaleImage
  52. storage = cvCreateMemStorage(0);
  53. cvClearMemStorage(storage);
  54. cvCvtColor(src_img, src_gray, CV_BGR2GRAY);
  55. cvEqualizeHist(src_gray, src_gray);
  56. //Detect Face
  57. printf("Detecting face.."); fflush(stdout);
  58. int i;
  59. static CvScalar colors[] = {
  60. {{0, 0, 255}}, {{0, 128, 255}},
  61. {{0, 255, 255}}, {{0, 255, 0}},
  62. {{255, 128, 0}}, {{255, 255, 0}},
  63. {{255, 0, 0}}, {{255, 0, 255}}
  64. };
  65.  
  66. cascade = (CvHaarClassifierCascade *)cvLoad(face_cascade, 0, 0, 0);
  67. printf("find objects..."); fflush(stdout);
  68. seq = cvHaarDetectObjects(src_gray, cascade, storage, 2.0, 4, 0, cvSize(40,40));
  69. printf("...done");
  70. if (seq->total > 0) {
  71. //顔領域を取得
  72. face_rect = (CvRect *) cvGetSeqElem(seq, 1);
  73. //顔の下半分の領域
  74. lower_half = cvRect(face_rect->x, face_rect->y + face_rect->height / 2,
  75. face_rect->width, face_rect->height / 2);
  76. CvPoint center;
  77. int radius;
  78. center.x = cvRound (face_rect->x + face_rect->width * 0.5);
  79. center.y = cvRound (face_rect->y + face_rect->height * 0.5);
  80. radius = cvRound ((face_rect->width + face_rect->height) * 0.25);
  81. cvCircle (src_img, center, radius, colors[i % 8], 3, 8, 0);
  82. cvSetImageROI(src_img, *face_rect);
  83. cvSetImageROI(src_gray, *face_rect);
  84. } else {
  85. printf("no face detected\n");
  86. exit(-1);
  87. }
  88. printf("..done\n");
  89. //Detect Eyes
  90. printf("Detecting eyes.."); fflush(stdout);
  91. detectObj(eye_cascade, src_img, src_gray, storage, 2);
  92. printf("..done\n");
  93. //Detect Nose
  94. printf("Detecting nose.."); fflush(stdout);
  95. detectObj(nose_cascade, src_img, src_gray, storage, 1);
  96. printf("..done\n");
  97. //Detect Mouth
  98.  
  99. cvResetImageROI(src_img);
  100. cvResetImageROI(src_gray);
  101. cvSetImageROI(src_img, lower_half);
  102. cvSetImageROI(src_gray, lower_half);
  103. printf("Detecting mouth.."); fflush(stdout);
  104. detectObj(mouth_cascade, src_img, src_gray, storage, 1);
  105. printf("..done\n");
  106.  
  107. cvResetImageROI(src_img);
  108. cvResetImageROI(src_gray);
  109.  
  110. //Show Image
  111. cvNamedWindow("Face detection", CV_WINDOW_AUTOSIZE);
  112. cvShowImage("Face Detection", src_img);
  113. cvWaitKey(0);
  114. //Cleanup
  115. cvReleaseImage(&src_img);
  116. cvReleaseImage(&src_gray);
  117. cvReleaseMemStorage(&storage);
  118. return 0;
  119. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement