SHARE
TWEET

Untitled

a guest May 11th, 2018 79 Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  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. }
RAW Paste Data
We use cookies for various purposes including analytics. By continuing to use Pastebin, you agree to our use of cookies as described in the Cookies Policy. OK, I Understand
 
Top