复制粘贴即可实现功能
#ifndef MAINWINDOW_H
#define MAINWINDOW_H
#include <QMainWindow>
#include <QCamera>
#include <opencv2/highgui/highgui.hpp>
#include <opencv2/imgproc/imgproc.hpp>
#include <opencv2/core/core.hpp>
#include <opencv2/objdetect/objdetect.hpp>
#include <QTimer>
QT_BEGIN_NAMESPACE
namespace Ui {
class MainWindow; }
QT_END_NAMESPACE
using namespace std;
class MainWindow : public QMainWindow
{
Q_OBJECT
public:
MainWindow(QWidget *parent = nullptr);
~MainWindow();
private slots:
void Func();
protected:
bool eventFilter(QObject *obj, QEvent *event);
private:
Ui::MainWindow *ui;
QCamera *m_camera;
QTimer *timer;
cv::CascadeClassifier face_cascade;
};
#endif
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <opencv2/core/core.hpp>
#include <opencv2/highgui/highgui.hpp>
#include "opencv2/imgproc/types_c.h"
#include <QTimer>
#include <QDateTime>
#include <QKeyEvent>
cv::Mat QImage2cvMat(QImage image);
QImage MatToQImage(const cv::Mat& mat);
MainWindow::MainWindow(QWidget *parent)
: QMainWindow(parent)
, ui(new Ui::MainWindow)
{
ui->setupUi(this);
m_camera = new QCamera(this);
m_camera->setCaptureMode(QCamera::CaptureVideo);
m_camera->setViewfinder(ui->videoWidget);
m_camera->start();
timer = new QTimer(this);
connect(timer, SIGNAL(timeout()), this, SLOT(Func()));
timer->start(5);
ui->label_test->installEventFilter(this);
}
MainWindow::~MainWindow()
{
delete ui;
}
void MainWindow::Func()
{
QDateTime current_date_time =QDateTime::currentDateTime();
QString current_date =current_date_time.toString("yyyy.MM.dd hh:mm:ss.zzz ddd");
ui->label->setText(current_date);
QPixmap pixmap = ui->videoWidget->grab();
QImage image = pixmap.toImage();
cv::Mat a = QImage2cvMat(image);
face_cascade.load("D:/OpenCV_MinGW_Build_x64/etc/haarcascades/haarcascade_frontalface_alt2.xml");
cv::Mat grayImg;
std::vector<cv::Rect> faces;
cv::cvtColor(a, grayImg, cv::COLOR_BGR2GRAY);
equalizeHist(grayImg, grayImg);
face_cascade.detectMultiScale(grayImg, faces, 1.1, 4,cv::CASCADE_SCALE_IMAGE,cv::Size(70, 70), cv::Size(1000, 1000));
for (size_t i = 0; i < faces.size(); i++)
{
rectangle(a, faces[i], cv::Scalar(0, 0, 1), 2, 8, 0);
}
ui->label_test->setPixmap(pixmap);
}
cv::Mat QImage2cvMat(QImage image)
{
cv::Mat mat;
switch (image.format())
{
case QImage::Format_ARGB32:
case QImage::Format_RGB32:
case QImage::Format_ARGB32_Premultiplied:
mat = cv::Mat(image.height(), image.width(), CV_8UC4, (void*)image.constBits(), image.bytesPerLine());
break;
case QImage::Format_RGB888:
mat = cv::Mat(image.height(), image.width(), CV_8UC3, (void*)image.constBits(), image.bytesPerLine());
cv::cvtColor(mat, mat, CV_BGR2RGB);
break;
case QImage::Format_Indexed8:
mat = cv::Mat(image.height(), image.width(), CV_8UC1, (void*)image.constBits(), image.bytesPerLine());
break;
}
return mat;
}
int i = 0;
bool MainWindow::eventFilter(QObject *obj, QEvent *event)
{
if (obj == ui->label_test)
{
if (event->type() == QEvent::MouseButtonDblClick)
{
i++;
if (i % 2 == 0)
{
ui->label_test->setWindowFlags(Qt::Dialog);
ui->label_test->showFullScreen();
}
else
{
ui->label_test->setWindowFlags(Qt::SubWindow);
ui->label->setFixedSize(500,350);
ui->label_test->showNormal();
};
}
return QObject::eventFilter(obj, event);
}
}