Advertisement
Guest User

Untitled

a guest
May 11th, 2018
202
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 6.16 KB | None | 0 0
  1. cv::Mat MainWindow::detectAndDraw_image(cv::Mat& img, cv::Ptr<cv::cuda::CascadeClassifier>& cascade,
  2. cv::Ptr<cv::cuda::CascadeClassifier>& nestedCascade,
  3. cv::Ptr<cv::cuda::CascadeClassifier>& eyesCascade,
  4. double& scale)
  5. //cv::Mat MainWindow::detectAndDraw_image(cv::Mat& img, cv::CascadeClassifier& cascade,
  6. // cv::CascadeClassifier nestedCascade,
  7. // cv::CascadeClassifier eyesCascade,
  8. // double& scale)
  9. {
  10. vector<Rect> faces;
  11. int face_smile = 0;
  12. const static Scalar colors[] =
  13. {
  14. Scalar(255,0,0),
  15. Scalar(255,128,0),
  16. Scalar(255,255,0),
  17. Scalar(0,255,0),
  18. Scalar(0,128,255),
  19. Scalar(0,255,255),
  20. Scalar(0,0,255),
  21. Scalar(255,0,255)
  22. };
  23. Mat gray, smallImg;
  24.  
  25. cv::cvtColor(img, gray, COLOR_BGR2GRAY);
  26.  
  27. double fx = 1 / scale;
  28. cv::resize(gray, smallImg, Size(), fx, fx, INTER_LINEAR_EXACT);
  29. cv::equalizeHist(smallImg, smallImg);
  30.  
  31. cv::cuda::GpuMat smallImg_cuda(smallImg);
  32. cv::cuda::GpuMat faces_cuda;
  33. cascade->setScaleFactor(1.1);
  34. cascade->setMinNeighbors(2);
  35. cascade->detectMultiScale(smallImg_cuda, faces_cuda);
  36. if(!faces_cuda.empty())
  37. cascade->convert(faces_cuda,faces);
  38.  
  39.  
  40.  
  41.  
  42.  
  43. // cascade.detectMultiScale(smallImg, faces,
  44. // 1.1, 2, 0
  45. // //|CASCADE_FIND_BIGGEST_OBJECT
  46. // //|CASCADE_DO_ROUGH_SEARCH
  47. // | CASCADE_SCALE_IMAGE,
  48. // Size(30, 30));
  49.  
  50.  
  51. for (size_t i = 0; i < faces.size(); i++)
  52. {
  53. Rect r = faces[i];
  54. Mat smallImgROI;
  55. vector<Rect> nestedObjects;
  56. vector<Rect> eyesObjects;
  57.  
  58.  
  59. cv::cuda::GpuMat nestedObjects_cuda;
  60. cv::cuda::GpuMat eyesObjects_cuda;
  61.  
  62. Point center;
  63. Scalar color = colors[i % 8];
  64. int radius;
  65.  
  66. double aspect_ratio = (double)r.width / r.height;
  67. if (0.75 < aspect_ratio && aspect_ratio < 1.3)
  68. {
  69. rectangle(img, cvPoint(cvRound(r.x*scale), cvRound(r.y*scale)),
  70. cvPoint(cvRound((r.x + r.width - 1)*scale), cvRound((r.y + r.height - 1)*scale)),
  71. color, 2, 8, 0);
  72. }
  73. else
  74. rectangle(img, cvPoint(cvRound(r.x*scale), cvRound(r.y*scale)),
  75. cvPoint(cvRound((r.x + r.width - 1)*scale), cvRound((r.y + r.height - 1)*scale)),
  76. color, 3, 8, 0);
  77.  
  78. const int half_height = cvRound((float)r.height / 2);
  79. r.y = r.y + half_height;
  80. r.height = half_height - 1;
  81. smallImgROI = smallImg(r);
  82. cv::cuda::GpuMat smallImgROI_cuda(smallImgROI);
  83.  
  84.  
  85. // eyesCascade->setScaleFactor(1.1);
  86. // eyesCascade->setMinNeighbors(2);
  87. // eyesCascade->detectMultiScale(smallImgROI_cuda, eyesObjects_cuda);
  88. // eyesCascade->convert(eyesObjects_cuda,eyesObjects);
  89.  
  90.  
  91.  
  92. // eyesCascade.detectMultiScale(smallImgROI, eyesObjects,
  93. // 1.1, 2, 0
  94. // //|CASCADE_FIND_BIGGEST_OBJECT
  95. // //|CASCADE_DO_ROUGH_SEARCH
  96. // //|CASCADE_DO_CANNY_PRUNING
  97. // | CASCADE_SCALE_IMAGE,
  98. // Size(30, 30));
  99.  
  100. nestedCascade->setScaleFactor(1.4);
  101. nestedCascade->setMinNeighbors(0);
  102. nestedCascade->detectMultiScale(smallImgROI_cuda, nestedObjects_cuda);
  103. if(!nestedObjects_cuda.empty())
  104. nestedCascade->convert(nestedObjects_cuda,nestedObjects);
  105.  
  106.  
  107.  
  108. // nestedCascade.detectMultiScale( smallImgROI, nestedObjects,
  109. // 1.1, 0, 0
  110. // //|CASCADE_FIND_BIGGEST_OBJECT
  111. // //|CASCADE_DO_ROUGH_SEARCH
  112. // //|CASCADE_DO_CANNY_PRUNING
  113. // |CASCADE_SCALE_IMAGE,
  114. // Size(30, 30));
  115.  
  116.  
  117.  
  118.  
  119.  
  120. // for (size_t g = 0; g < eyesObjects.size(); g++)
  121. // {
  122. // center;
  123. // Rect nr = eyesObjects[g];
  124. // center.x = cvRound((r.x + nr.x + nr.width*0.5)*scale);
  125. // center.y = cvRound((r.y + nr.y + nr.height*0.5)*scale);
  126. // int radius = cvRound((nr.width + nr.height)*0.25*scale);
  127. // circle(img, center, radius, color, 1.5, 8, 0);
  128. // }
  129.  
  130. // The number of detected neighbors depends on image size (and also illumination, etc.). The
  131. // following steps use a floating minimum and maximum of neighbors. Intensity thus estimated will be
  132. //accurate only after a first smile has been displayed by the user.
  133. const int smile_neighbors = (int)nestedObjects.size();
  134.  
  135.  
  136. static int max_neighbors = -1;
  137. static int min_neighbors = -1;
  138. if (min_neighbors == -1) min_neighbors = smile_neighbors;
  139. max_neighbors = MAX(max_neighbors, smile_neighbors);
  140.  
  141. // Draw rectangle on the left side of the image reflecting smile intensity
  142. float intensityZeroOne = ((float)smile_neighbors - min_neighbors) / (max_neighbors - min_neighbors + 1);
  143. int rect_height = cvRound((float)img.rows * intensityZeroOne);
  144. Scalar col = Scalar((float)255 * intensityZeroOne, 0, 0);
  145. //rectangle(img, cvPoint(0, img.rows), cvPoint(img.cols / 10, img.rows - rect_height), col, -1);
  146. CvPoint pt = cvPoint( cvRound(r.x)-30, cvRound(r.y));
  147.  
  148. if (intensityZeroOne > 0.6)
  149. {
  150. CvFont font;
  151. cvInitFont(&font, CV_FONT_HERSHEY_COMPLEX, 1.0, 1.0, 0, 1, CV_AA);
  152. // используя шрифт выводим на картинку текст
  153. //cvPutText((CvArr*)img, "Smile!", pt, &font, CV_RGB(150, 0, 150));
  154. putText(img, "Smile!", pt, CV_FONT_HERSHEY_COMPLEX, 1.1,
  155. Scalar::all(255), 2, 8);
  156. face_smile++;
  157. }
  158. else
  159. {
  160. CvFont font;
  161. cvInitFont(&font, CV_FONT_HERSHEY_COMPLEX, 1.0, 1.0, 0, 1, CV_AA);
  162. // используя шрифт выводим на картинку текст
  163. //cvPutText((CvArr*)img, "Smile!", pt, &font, CV_RGB(150, 0, 150));
  164. putText(img, "Neutral!", pt, CV_FONT_HERSHEY_COMPLEX, 1.1,
  165. Scalar::all(255), 2, 8);
  166.  
  167.  
  168. }
  169.  
  170. pt = NULL;
  171.  
  172.  
  173.  
  174. }
  175. faces_size_all = faces.size();
  176. smiles.push_back(face_smile);
  177.  
  178. return img;
  179. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement