Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include "mainwindow.h"
- #include "ui_mainwindow.h"
- #include <QMessageBox>
- using namespace cv;
- using namespace std;
- MainWindow::MainWindow(QWidget *parent) :
- QMainWindow(parent),
- ui(new Ui::MainWindow)
- {
- ui->setupUi(this);
- capture.open(0);
- if(!capture.isOpened())
- {
- QMessageBox::information(ERROR,"ERROR","ERROR: Could not open webcam");
- }
- cascadeName = "haarcascade_frontalface_alt.xml";
- nestedCascadeName = "haarcascade_smile.xml";
- eyesCascadeName = "haarcascade_eye_tree_eyeglasses.xml";
- if (!cascade.load(cascadeName))
- {
- QMessageBox::information(ERROR,"ERROR","ERROR: Could not load face cascade");
- }
- if (!nestedCascade.load(nestedCascadeName))
- {
- QMessageBox::information(ERROR,"ERROR","ERROR: Could not load smile cascade");
- }
- if (!eyesCascade.load(eyesCascadeName))
- {
- QMessageBox::information(ERROR,"ERROR","ERROR: Could not load eyes cascade");
- }
- tmrTimer = new QTimer(this);
- connect(tmrTimer,SIGNAL(timeout()),this,SLOT(proccesFrameUpdGui()));
- tmrTimer->start(20);
- }
- MainWindow::~MainWindow()
- {
- delete ui;
- }
- void MainWindow::proccesFrameUpdGui(){
- capture >> frame;
- frame1 = frame.clone();
- Size raz(ui->label_original->width(),ui->label_original->height());
- Size raz2(ui->label_faces->width(),ui->label_faces->height());
- cv::resize(frame,frame,raz,0,0,INTER_LINEAR);
- if(frame.empty())
- return;
- QImage qFrame((uchar*)frame.data, frame.cols, frame.rows, frame.step, QImage::Format_RGB888);
- frame1 = detectAndDraw_image(frame1, cascade, nestedCascade, eyesCascade, scale);
- cv::resize(frame1,frame1,raz2,0,0,INTER_LINEAR);
- QImage qFrame1((uchar*)frame1.data, frame1.cols, frame1.rows, frame1.step, QImage::Format_RGB888);
- ui->label_faces->setPixmap(QPixmap::fromImage(qFrame1));
- ui->label_original->setPixmap(QPixmap::fromImage(qFrame));
- }
- void MainWindow::on_Start_clicked()
- {
- if(tmrTimer->isActive()){
- tmrTimer->stop();
- ui->Start->setText("Resume");
- }
- else{
- tmrTimer->start(20);
- ui->Start->setText("Pause");
- }
- }
- Mat detectAndDraw_image(Mat& img, CascadeClassifier& cascade,
- CascadeClassifier& nestedCascade,
- CascadeClassifier& eyesCascade,
- double scale)
- {
- vector<Rect> faces;
- const static Scalar colors[] =
- {
- Scalar(255,0,0),
- Scalar(255,128,0),
- Scalar(255,255,0),
- Scalar(0,255,0),
- Scalar(0,128,255),
- Scalar(0,255,255),
- Scalar(0,0,255),
- Scalar(255,0,255)
- };
- Mat gray, smallImg;
- cvtColor(img, gray, COLOR_BGR2GRAY);
- double fx = 1 / scale;
- cv::resize(gray, smallImg, Size(), fx, fx, INTER_LINEAR_EXACT);
- equalizeHist(smallImg, smallImg);
- cascade.detectMultiScale(smallImg, faces,
- 1.1, 2, 0
- //|CASCADE_FIND_BIGGEST_OBJECT
- //|CASCADE_DO_ROUGH_SEARCH
- | CASCADE_SCALE_IMAGE,
- Size(30, 30));
- for (size_t i = 0; i < faces.size(); i++)
- {
- Rect r = faces[i];
- Mat smallImgROI;
- vector<Rect> nestedObjects;
- vector<Rect> eyesObjects;
- Point center;
- Scalar color = colors[i % 8];
- int radius;
- double aspect_ratio = (double)r.width / r.height;
- if (0.75 < aspect_ratio && aspect_ratio < 1.3)
- {
- center.x = cvRound((r.x + r.width*0.5)*scale);
- center.y = cvRound((r.y + r.height*0.5)*scale);
- radius = cvRound((r.width + r.height)*0.25*scale);
- circle(img, center, radius, color, 3, 8, 0);
- //rectangle(img, cvPoint(cvRound(r.x*scale), cvRound(r.y*scale)),
- // cvPoint(cvRound((r.x + r.width - 1)*scale), cvRound((r.y + r.height - 1)*scale)),
- // color, 2, 8, 0);
- }
- else
- rectangle(img, cvPoint(cvRound(r.x*scale), cvRound(r.y*scale)),
- cvPoint(cvRound((r.x + r.width - 1)*scale), cvRound((r.y + r.height - 1)*scale)),
- color, 3, 8, 0);
- const int half_height = cvRound((float)r.height / 2);
- r.y = r.y + half_height;
- r.height = half_height - 1;
- smallImgROI = smallImg(r);
- eyesCascade.detectMultiScale(smallImgROI, eyesObjects,
- 1.1, 2, 0
- //|CASCADE_FIND_BIGGEST_OBJECT
- //|CASCADE_DO_ROUGH_SEARCH
- //|CASCADE_DO_CANNY_PRUNING
- | CASCADE_SCALE_IMAGE,
- Size(30, 30));
- nestedCascade.detectMultiScale(smallImgROI, nestedObjects,
- 1.5, 0, 0
- //|CASCADE_FIND_BIGGEST_OBJECT
- //|CASCADE_DO_ROUGH_SEARCH
- //|CASCADE_DO_CANNY_PRUNING
- | CASCADE_SCALE_IMAGE,
- Size(30, 30));
- for (size_t g = 0; g < eyesObjects.size(); g++)
- {
- center;
- Rect nr = eyesObjects[g];
- center.x = cvRound((r.x + nr.x + nr.width*0.5)*scale);
- center.y = cvRound((r.y + nr.y + nr.height*0.5)*scale);
- int radius = cvRound((nr.width + nr.height)*0.25*scale);
- circle(img, center, radius, color, 1.5, 8, 0);
- }
- // The number of detected neighbors depends on image size (and also illumination, etc.). The
- // following steps use a floating minimum and maximum of neighbors. Intensity thus estimated will be
- //accurate only after a first smile has been displayed by the user.
- const int smile_neighbors = (int)nestedObjects.size();
- /*
- static int max_neighbors = -1;
- static int min_neighbors = -1;
- if (min_neighbors == -1) min_neighbors = smile_neighbors;
- max_neighbors = MAX(max_neighbors, smile_neighbors);*/
- // Draw rectangle on the left side of the image reflecting smile intensity
- //float intensityZeroOne = ((float)smile_neighbors - min_neighbors) / (max_neighbors - min_neighbors + 1);
- //int rect_height = cvRound((float)img.rows * intensityZeroOne);
- //Scalar col = Scalar((float)255 * intensityZeroOne, 0, 0);
- //rectangle(img, cvPoint(0, img.rows), cvPoint(img.cols / 10, img.rows - rect_height), col, -1);
- CvPoint pt = cvPoint( cvRound(r.x), cvRound(r.y));
- if (smile_neighbors > 5)
- {
- CvFont font;
- cvInitFont(&font, CV_FONT_HERSHEY_COMPLEX, 1.0, 1.0, 0, 1, CV_AA);
- // используя шрифт выводим на картинку текст
- //cvPutText((CvArr*)img, "Smile!", pt, &font, CV_RGB(150, 0, 150));
- putText(img, "Smile!", pt, CV_FONT_HERSHEY_COMPLEX, 0.5,
- Scalar::all(255), 1, 8);
- }
- else
- {
- CvFont font;
- cvInitFont(&font, CV_FONT_HERSHEY_COMPLEX, 1.0, 1.0, 0, 1, CV_AA);
- // используя шрифт выводим на картинку текст
- //cvPutText((CvArr*)img, "Smile!", pt, &font, CV_RGB(150, 0, 150));
- putText(img, "Neutral!", pt, CV_FONT_HERSHEY_COMPLEX, 0.5,
- Scalar::all(255), 1, 8);
- }
- pt = NULL;
- }
- return img;
- //imshow("result", img);
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement