widget.h
#ifndef WIDGET_H
#define WIDGET_H
#include <QWidget>
#include <QImage>
#include <QFileDialog>
#include <QTime>
#include <opencv2/core/core.hpp>
#include <opencv2/highgui/highgui.hpp>
#include <opencv2/imgproc/imgproc.hpp>
#include <opencv2/objdetect/objdetect.hpp>
#include <iostream>
#include <stdio.h>
using namespace std;
using namespace cv;
namespace Ui {
class Widget;
}
class Widget : public QWidget
{
Q_OBJECT
public:
explicit Widget(QWidget *parent = 0);
~Widget();
void displayMat(Mat image);
void detectAndDisplay(Mat face);
private slots:
void on_pushButton_clicked();
void on_close_putton_clicked();
void on_facedefication_clicked();
private:
Ui::Widget *ui;
cv::Mat image;
CascadeClassifier face_cascade;
};
#endif // WIDGET_H
widget.cpp
#include "widget.h"
#include "ui_widget.h"
#include <QDebug>
Widget::Widget(QWidget *parent) :
QWidget(parent),
ui(new Ui::Widget)
{
ui->setupUi(this);
}
Widget::~Widget()
{
delete ui;
}
void Widget::displayMat(Mat image)
{
Mat rgb;
QImage img;
if(image.channels()==3)
{
cvtColor(image,rgb,CV_BGR2RGB);
img = QImage((const unsigned char*)(rgb.data),
rgb.cols,rgb.rows,
rgb.cols*rgb.channels(),
QImage::Format_RGB888);
}
else
{
img = QImage((const unsigned char*)(image.data),
image.cols,image.rows,
image.cols*image.channels(),
QImage::Format_RGB888);
}
ui->imagelabel->setPixmap(QPixmap::fromImage(img).scaled(ui->imagelabel->size()));
ui->imagelabel->resize(ui->imagelabel->pixmap()->size());
}
void Widget::on_pushButton_clicked()
{
QString fileName = QFileDialog::getOpenFileName(this,tr("Open Image"),".",tr("Image Files(*.png *.jpg *.bmp)"));
qDebug()<<"filename:"<<fileName;
image = cv::imread(fileName.toAscii().data());
displayMat(image);
}
void Widget::on_close_putton_clicked()
{
this->close();
}
void Widget::on_facedefication_clicked()
{
string face_cascade_name = "/root/haarcascade_frontalface_alt.xml";
if(face_cascade.load(face_cascade_name))
{
qDebug()<<"Load cascade classifier correctly";
detectAndDisplay(image); //调用人脸检测函数
}
}
void Widget::detectAndDisplay(Mat face) {
std::vector<Rect> faces;
Mat face_gray;
cvtColor(face, face_gray, CV_BGR2GRAY); //rgb类型转换为灰度类型
equalizeHist(face_gray, face_gray); //直方图均衡化
face_cascade.detectMultiScale(face_gray, faces, 1.1, 2, 0 | CV_HAAR_SCALE_IMAGE, Size(1, 1));
for (int i = 0; i < faces.size(); i++) {
Point center(faces[i].x + faces[i].width*0.5, faces[i].y + faces[i].height*0.5);
ellipse(face, center, Size(faces[i].width*0.5, faces[i].height*0.5), 0, 0, 360, Scalar(255, 0, 0), 2, 7, 0);
}
displayMat(face);
}
图形界面: