Advertisement
Guest User

Untitled

a guest
May 1st, 2018
187
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 7.25 KB | None | 0 0
  1. #include "mainwindow.h"
  2. #include "ui_mainwindow.h"
  3. #include <QMessageBox>
  4.  
  5. using namespace cv;
  6. using namespace std;
  7.  
  8.  
  9. MainWindow::MainWindow(QWidget *parent) :
  10. QMainWindow(parent),
  11. ui(new Ui::MainWindow)
  12. {
  13. ui->setupUi(this);
  14. capture.open(0);
  15. if(!capture.isOpened())
  16. {
  17.  
  18. QMessageBox::information(ERROR,"ERROR","ERROR: Could not open webcam");
  19. }
  20. cascadeName = "haarcascade_frontalface_alt.xml";
  21. nestedCascadeName = "haarcascade_smile.xml";
  22. eyesCascadeName = "haarcascade_eye_tree_eyeglasses.xml";
  23. if (!cascade.load(cascadeName))
  24. {
  25. QMessageBox::information(ERROR,"ERROR","ERROR: Could not load face cascade");
  26. }
  27. if (!nestedCascade.load(nestedCascadeName))
  28. {
  29. QMessageBox::information(ERROR,"ERROR","ERROR: Could not load smile cascade");
  30.  
  31.  
  32.  
  33. }
  34. if (!eyesCascade.load(eyesCascadeName))
  35. {
  36. QMessageBox::information(ERROR,"ERROR","ERROR: Could not load eyes cascade");
  37. }
  38.  
  39. tmrTimer = new QTimer(this);
  40. connect(tmrTimer,SIGNAL(timeout()),this,SLOT(proccesFrameUpdGui()));
  41. tmrTimer->start(20);
  42. }
  43.  
  44. MainWindow::~MainWindow()
  45. {
  46. delete ui;
  47. }
  48.  
  49.  
  50. void MainWindow::proccesFrameUpdGui(){
  51.  
  52. capture >> frame;
  53. frame1 = frame.clone();
  54. Size raz(ui->label_original->width(),ui->label_original->height());
  55. Size raz2(ui->label_faces->width(),ui->label_faces->height());
  56. cv::resize(frame,frame,raz,0,0,INTER_LINEAR);
  57.  
  58. if(frame.empty())
  59. return;
  60.  
  61. QImage qFrame((uchar*)frame.data, frame.cols, frame.rows, frame.step, QImage::Format_RGB888);
  62.  
  63.  
  64. frame1 = detectAndDraw_image(frame1, cascade, nestedCascade, eyesCascade, scale);
  65. cv::resize(frame1,frame1,raz2,0,0,INTER_LINEAR);
  66.  
  67. QImage qFrame1((uchar*)frame1.data, frame1.cols, frame1.rows, frame1.step, QImage::Format_RGB888);
  68.  
  69.  
  70. ui->label_faces->setPixmap(QPixmap::fromImage(qFrame1));
  71. ui->label_original->setPixmap(QPixmap::fromImage(qFrame));
  72. }
  73.  
  74. void MainWindow::on_Start_clicked()
  75. {
  76. if(tmrTimer->isActive()){
  77. tmrTimer->stop();
  78. ui->Start->setText("Resume");
  79. }
  80. else{
  81. tmrTimer->start(20);
  82. ui->Start->setText("Pause");
  83. }
  84. }
  85.  
  86.  
  87.  
  88.  
  89. Mat detectAndDraw_image(Mat& img, CascadeClassifier& cascade,
  90. CascadeClassifier& nestedCascade,
  91. CascadeClassifier& eyesCascade,
  92. double scale)
  93. {
  94. vector<Rect> faces;
  95. const static Scalar colors[] =
  96. {
  97. Scalar(255,0,0),
  98. Scalar(255,128,0),
  99. Scalar(255,255,0),
  100. Scalar(0,255,0),
  101. Scalar(0,128,255),
  102. Scalar(0,255,255),
  103. Scalar(0,0,255),
  104. Scalar(255,0,255)
  105. };
  106. Mat gray, smallImg;
  107.  
  108. cvtColor(img, gray, COLOR_BGR2GRAY);
  109.  
  110. double fx = 1 / scale;
  111. cv::resize(gray, smallImg, Size(), fx, fx, INTER_LINEAR_EXACT);
  112. equalizeHist(smallImg, smallImg);
  113.  
  114. cascade.detectMultiScale(smallImg, faces,
  115. 1.1, 2, 0
  116. //|CASCADE_FIND_BIGGEST_OBJECT
  117. //|CASCADE_DO_ROUGH_SEARCH
  118. | CASCADE_SCALE_IMAGE,
  119. Size(30, 30));
  120.  
  121.  
  122. for (size_t i = 0; i < faces.size(); i++)
  123. {
  124. Rect r = faces[i];
  125. Mat smallImgROI;
  126. vector<Rect> nestedObjects;
  127. vector<Rect> eyesObjects;
  128. Point center;
  129. Scalar color = colors[i % 8];
  130. int radius;
  131.  
  132. double aspect_ratio = (double)r.width / r.height;
  133. if (0.75 < aspect_ratio && aspect_ratio < 1.3)
  134. {
  135. center.x = cvRound((r.x + r.width*0.5)*scale);
  136. center.y = cvRound((r.y + r.height*0.5)*scale);
  137. radius = cvRound((r.width + r.height)*0.25*scale);
  138. circle(img, center, radius, color, 3, 8, 0);
  139. //rectangle(img, cvPoint(cvRound(r.x*scale), cvRound(r.y*scale)),
  140. // cvPoint(cvRound((r.x + r.width - 1)*scale), cvRound((r.y + r.height - 1)*scale)),
  141. // color, 2, 8, 0);
  142. }
  143. else
  144. rectangle(img, cvPoint(cvRound(r.x*scale), cvRound(r.y*scale)),
  145. cvPoint(cvRound((r.x + r.width - 1)*scale), cvRound((r.y + r.height - 1)*scale)),
  146. color, 3, 8, 0);
  147.  
  148. const int half_height = cvRound((float)r.height / 2);
  149. r.y = r.y + half_height;
  150. r.height = half_height - 1;
  151. smallImgROI = smallImg(r);
  152.  
  153.  
  154.  
  155.  
  156.  
  157.  
  158. eyesCascade.detectMultiScale(smallImgROI, eyesObjects,
  159. 1.1, 2, 0
  160. //|CASCADE_FIND_BIGGEST_OBJECT
  161. //|CASCADE_DO_ROUGH_SEARCH
  162. //|CASCADE_DO_CANNY_PRUNING
  163. | CASCADE_SCALE_IMAGE,
  164. Size(30, 30));
  165.  
  166. nestedCascade.detectMultiScale(smallImgROI, nestedObjects,
  167. 1.5, 0, 0
  168. //|CASCADE_FIND_BIGGEST_OBJECT
  169. //|CASCADE_DO_ROUGH_SEARCH
  170. //|CASCADE_DO_CANNY_PRUNING
  171. | CASCADE_SCALE_IMAGE,
  172. Size(30, 30));
  173.  
  174.  
  175.  
  176.  
  177.  
  178. for (size_t g = 0; g < eyesObjects.size(); g++)
  179. {
  180. center;
  181. Rect nr = eyesObjects[g];
  182. center.x = cvRound((r.x + nr.x + nr.width*0.5)*scale);
  183. center.y = cvRound((r.y + nr.y + nr.height*0.5)*scale);
  184. int radius = cvRound((nr.width + nr.height)*0.25*scale);
  185. circle(img, center, radius, color, 1.5, 8, 0);
  186. }
  187.  
  188. // The number of detected neighbors depends on image size (and also illumination, etc.). The
  189. // following steps use a floating minimum and maximum of neighbors. Intensity thus estimated will be
  190. //accurate only after a first smile has been displayed by the user.
  191. const int smile_neighbors = (int)nestedObjects.size();
  192.  
  193. /*
  194. static int max_neighbors = -1;
  195. static int min_neighbors = -1;
  196. if (min_neighbors == -1) min_neighbors = smile_neighbors;
  197. max_neighbors = MAX(max_neighbors, smile_neighbors);*/
  198.  
  199. // Draw rectangle on the left side of the image reflecting smile intensity
  200. //float intensityZeroOne = ((float)smile_neighbors - min_neighbors) / (max_neighbors - min_neighbors + 1);
  201. //int rect_height = cvRound((float)img.rows * intensityZeroOne);
  202. //Scalar col = Scalar((float)255 * intensityZeroOne, 0, 0);
  203. //rectangle(img, cvPoint(0, img.rows), cvPoint(img.cols / 10, img.rows - rect_height), col, -1);
  204. CvPoint pt = cvPoint( cvRound(r.x), cvRound(r.y));
  205.  
  206. if (smile_neighbors > 5)
  207. {
  208. CvFont font;
  209. cvInitFont(&font, CV_FONT_HERSHEY_COMPLEX, 1.0, 1.0, 0, 1, CV_AA);
  210. // используя шрифт выводим на картинку текст
  211. //cvPutText((CvArr*)img, "Smile!", pt, &font, CV_RGB(150, 0, 150));
  212. putText(img, "Smile!", pt, CV_FONT_HERSHEY_COMPLEX, 0.5,
  213. Scalar::all(255), 1, 8);
  214.  
  215. }
  216. else
  217. {
  218. CvFont font;
  219. cvInitFont(&font, CV_FONT_HERSHEY_COMPLEX, 1.0, 1.0, 0, 1, CV_AA);
  220. // используя шрифт выводим на картинку текст
  221. //cvPutText((CvArr*)img, "Smile!", pt, &font, CV_RGB(150, 0, 150));
  222. putText(img, "Neutral!", pt, CV_FONT_HERSHEY_COMPLEX, 0.5,
  223. Scalar::all(255), 1, 8);
  224.  
  225.  
  226. }
  227.  
  228. pt = NULL;
  229.  
  230.  
  231.  
  232. }
  233. return img;
  234. //imshow("result", img);
  235. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement