opencv系列(1)--使用opencv和Qt6做一个视频监控器人脸识别

这篇具有很好参考价值的文章主要介绍了opencv系列(1)--使用opencv和Qt6做一个视频监控器人脸识别。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

程序功能说明:

这个程序是自己的下班之后,看看那个坏东西想来偷看我的电脑。我就随手做的一个程序。
1.能都显示摄像头的内容。
2.如果有人进入摄像头。
3.利用opencv的模型识别人脸,识别到了就保存到自己的电脑里面。
4.并把他的照片显示到界面上一段时间,告诉他,偷窥有罪。
5.程序是完全可以隐藏的,就是没有界面,可以通过快捷键来显示界面(ctr+p),再次点击则隐藏。按下(ctr+s)结束程序。
6.程序在做的时候,增加了任务栏托盘的功能,也可以通过任务栏托盘进行显示。

说明:

用了全局热键捕捉。第三方库:QHotkey
然后用的opencv 的话是用mingw的编译的,版本是411的,可以自己编译,也可以去github上面去下载已经编译好的,我使用github上编译好的。

功能就讲到这里,下边是简单的代码。

文件.pro

QT       += core gui
QT += multimedia
QT += multimediawidgets

greaterThan(QT_MAJOR_VERSION, 4): QT += widgets

CONFIG += c++17

INCLUDEPATH += D:\\Z_DLL\\OpenCV-MinGW4.1.1\\include
LIBS += -LD:\\Z_DLL\\OpenCV-MinGW4.1.1\\x64\\mingw\\lib \
    -lopencv_core411 \
    -lopencv_highgui411 \
    -lopencv_imgproc411 \
    -lopencv_imgcodecs411 \
    -lopencv_objdetect411 \
    -lopencv_videoio411
include(QHotkey/QHotkey.pri)

# You can make your code fail to compile if it uses deprecated APIs.
# In order to do so, uncomment the following line.
#DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0x060000    # disables all the APIs deprecated before Qt 6.0.0

SOURCES += \
    main.cpp \
    mainwindow.cpp

HEADERS += \
    mainwindow.h

FORMS += \
    mainwindow.ui

# Default rules for deployment.
qnx: target.path = /tmp/$${TARGET}/bin
else: unix:!android: target.path = /opt/$${TARGET}/bin
!isEmpty(target.path): INSTALLS += target

文件main.cpp

int main(int argc, char *argv[]) {
    QApplication app(argc, argv);
    //QLabel显示界面
    MyLabel *label=new MyLabel;
    //label->show();
    return app.exec();
}

文件MyLabel

由于我使用QLable来显示图片的

class MyLabel : public QLabel {
public:
    MyLabel(){
        //设置热键
        hotkey_Ctrl_S = new QHotkey(QKeySequence("Ctrl+s"), true,this);
        connect(hotkey_Ctrl_S, &QHotkey::activated, qApp, &QCoreApplication::quit);
        hotkey_Ctrl_P = new QHotkey(QKeySequence("Ctrl+p"), true,this);
        connect(hotkey_Ctrl_P, &QHotkey::activated, [&](){
            if(isHidden())
                show();
            else
                hide();});

        trayIcon = new QSystemTrayIcon;
        trayIcon->setIcon(QIcon("D:\\icon.png")); // 设置托盘图标
        trayIcon->setVisible(true);
        // 创建托盘菜单
        trayIconMenu = new QMenu();
        QAction *quitAction = new QAction("退出", this);
        connect(quitAction, &QAction::triggered, qApp, &QCoreApplication::quit);
        trayIconMenu->addAction(quitAction);
        // 设置托盘菜单
        trayIcon->setContextMenu(trayIconMenu);
        connect(trayIcon, &QSystemTrayIcon::activated, this, [&](QSystemTrayIcon::ActivationReason reason){
        switch (reason) {
                case QSystemTrayIcon::Trigger:
                case QSystemTrayIcon::DoubleClick:
                    show();
                    break;
                default:
                    break;
            }
        });

        //信号
        connect(&faceDetector, &FaceDetector::imageReady, [&](const QImage &image) {
            setPixmap(QPixmap::fromImage(image));
            resize(image.size()); // 调整窗口大小以适应图像大小
        });
    }
protected:
    void closeEvent(QCloseEvent *event) override
    {
        if (trayIcon->isVisible()) {
            hide();
            event->ignore();
        }
    }
private:
    QSystemTrayIcon *trayIcon;
    QMenu           *trayIconMenu;
    //全局按键监控
    QHotkey *hotkey_Ctrl_P;
    QHotkey *hotkey_Ctrl_S;

    //人脸检测器
    FaceDetector faceDetector;
};

文件FaceDetector

提示警告框我是直接使用了QMessageBox来显示的,重写了一下这个类的事件。
每隔30ms就检测一下是否有人脸存在,如果存在就停止检测并显示警告。
30秒之后就自动的关闭警告窗口,继续监控。文章来源地址https://www.toymoban.com/news/detail-668398.html

#include <opencv2/opencv.hpp>
#include <opencv2/objdetect.hpp>
#include <QApplication>
#include <QSystemTrayIcon>
#include <QMenu>
#include <QAction>
#include <QCamera>
#include <QImageCapture>
#include <QMediaDevices>
#include <QMediaCaptureSession>
#include <QVideoWidget>
#include <QMouseEvent>
#include <QDateTime>
#include <QMediaRecorder>
#include <QSystemTrayIcon>
#include <QMenu>
#include <QHotkey>
#include <QVideoSink>
#include <QCameraFormat>
#include <QPainter>
#include <QMessageBox>
#include <QTimer>
#include <QImage>
#include <QLabel>

const int CLOSE_TIME = 10000;

class CustomMessageBox : public QMessageBox {
    Q_OBJECT
public:
    CustomMessageBox(QWidget *parent = nullptr) : QMessageBox(parent) {
        // 隐藏标准按钮
        setStandardButtons(QMessageBox::NoButton);
    }

signals:
    void timeout();

protected:
    void closeEvent(QCloseEvent *event) override {
        // 阻止用户关闭对话框
        event->ignore();
    }
};
class FaceDetector : public QObject {
    Q_OBJECT
public:
    FaceDetector(QObject *parent = nullptr) : QObject(parent) {
        // 加载人脸检测器
        faceCascade.load("D:\\Code\\Camera\\haarcascade.xml");

        // 打开摄像头
        cap.open(0);

        // 启动定时器,每隔30ms捕获一帧图像
        timer = new QTimer(this);
        connect(timer, &QTimer::timeout, this, &FaceDetector::captureFrame);
        timer->start(30);
    }
    ~FaceDetector(){};

signals:
    void imageReady(const QImage &image);

private slots:
    void captureFrame() {
        cv::Mat frame;
        cap >> frame;

        // 检测人脸
        std::vector<cv::Rect> faces;
        faceCascade.detectMultiScale(frame, faces);

        // 在检测到的人脸周围画矩形框
        for (const auto &face : faces) {
            cv::rectangle(frame, face, cv::Scalar(255, 0, 0));
        }

        // 如果检测到人脸,保存图像
        if (!faces.empty()) {
            QDateTime currentDateTime = QDateTime::currentDateTime();
            QString formattedDateTime = currentDateTime.toString("yyyy_MM_dd_hh_mm_ss");
            QString file="D:\\pic\\"+ formattedDateTime + ".jpg";
            std::string f = file.toStdString();
            cv::imwrite(f, frame);
        }

        // 将cv::Mat转换为QImage
        cv::cvtColor(frame, frame, cv::COLOR_BGR2RGB);
        QImage image(frame.data, frame.cols, frame.rows, frame.step, QImage::Format_RGB888);

        if(!faces.empty())
        {
            // 弹出对话框并显示人脸图像
            QLabel bel;
            CustomMessageBox msgBox(&bel);//=new CustomMessageBox();
            msgBox.setStyleSheet("QLabel {"
                              "font-size: 25px;"
                              "color: red;"
                              "}");
            msgBox.setText("个人使用的电脑有隐私,\n不要偷看!");
            msgBox.setIconPixmap(QPixmap::fromImage(image));
            timer->stop();
            connect(&msgBox, &CustomMessageBox::timeout, [&](){msgBox.reject();timer->start(30);});

            // CLOSE_TIME秒后发射timeout信号,关闭对话框
            QTimer::singleShot(CLOSE_TIME, &msgBox, &CustomMessageBox::timeout);

            // 显示模态对话框
            msgBox.exec();
        }
        // 发送信号,通知外部图像已准备好
        emit imageReady(image);
    }

private:
    cv::VideoCapture cap;
    cv::CascadeClassifier faceCascade;
    QTimer *timer;
};

到了这里,关于opencv系列(1)--使用opencv和Qt6做一个视频监控器人脸识别的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 深聊性能测试,从入门到放弃之: Windows系统性能监控(二) 资源监控器介绍及使用。

    小屌丝 :鱼哥,我看了你这篇《Windows系统性能监控(一) 性能监视器介绍及使用》,让我学到了好多知识。 小鱼 :嗯,我自己在写这篇文章的时候,也学到了好多。 小屌丝 :是吗,你不都是知道了,咋还又学到了好多; 小鱼 :这个很正常啊,你把你会的知识,重新以文字

    2024年01月25日
    浏览(40)
  • 系统性能监控-Windows自带性能监控器

    在性能测试过程中,往往需要对系统应用服务器,数据库服务器等服务端资源使用情况进行监控,以获取服务器性能数据,协助判断服务器性能是否满足性能需求;对于不同的服务器类型,监控服务器的方式也不尽相同,本篇我们主要来讲解对于Winsows 系的服务器的性能数据

    2024年02月10日
    浏览(33)
  • 搭建 QT6+OpenCv4.7+CMake的环境

    本文主要介绍如何搭建QT6+OpenCv的开发环境,基本流程如下 先安装CMake3.27.3,用来编译适用用QT的OpenCv的源码,安装完成后要配置系统的环境变量 安装Qt6的开发环境,并配置环境变量,注意一定要重启电脑才能生效 下载OpenCv的源码,用于后面的编译 上述环境准备好后,使用

    2024年02月09日
    浏览(30)
  • 【华为OD统一考试B卷 | 100分】统计监控器、需要打开多少监控器(Java JavaScript Python)

    2023年11月份,华为官方已经将 华为OD机考:OD统一考试(A卷 / B卷)切换到 OD统一考试(C卷)和 OD统一考试(D卷) 。根据考友反馈:目前抽到的试卷为B卷或C卷/D卷,其中C卷居多 ,按照之前的经验C卷部分考题会复用A卷,B卷题,博主正积极从考过的同学收集C卷和D卷真题。

    2024年02月11日
    浏览(32)
  • SpringCloud微服务的监控器,Actuator

    在微服务系统里,对微服务程序的运行状况的跟踪和监控是必不可少的;例如GPE,Telegraf+influxDB都提供了微服务体系监控的方案, ZIPKIN, Skywalking都提供了微服务云体系的APM的方案; 这些解决方案功能全面;但是都需要提供额外的资源进行架构; 其实在SpringBoot构建的微服务

    2023年04月18日
    浏览(30)
  • 【华为OD统一考试(B卷)】统计监控、需要打开多少监控器,JAVA 题解 | 华为OD机试考题

    华为 od 2023 | 什么是华为 od,od 薪资待遇,od 机试题清单 华为 OD 机试真题大全,用 Python 解华为机试题 | 机试宝典 【华为 OD 机试】全流程解析+经验分享,题型分享,防作弊指南 华为 od 机试,独家整理 已参加机试人员的实战技巧 参加华为 od 机试,一定要注意不要完全背诵代码

    2024年02月12日
    浏览(35)
  • 观测云产品更新 | 日志、场景仪表板、监控器等

    用户访问监测 (RUM ) 公网 Dataway 支持 ip 转换成地理位置信息。 日志 查看器详情页 1、新增 BPF 网络日志采集及日志详情页,支持 Json 格式转化; 2、上述 1 中的日志详情页中新增可读的展示模式,即您可以快速直观了解客户端与服务端之间的网络情况;同时,也支持切换绝

    2024年02月02日
    浏览(34)
  • ARM LDREX/STREX指令以及独占监控器详解

    Linux驱动开发中有一个特别重要的知识点必须掌握,即并发访问、竞态以及同步。 什么是并发? 多个执行单元(进程、线程、中断) 同时 对一个共享资源进行访问;此处的共享资源可以是外设、内存或者软件层面的全局变量静态变量等;只要并发的多个执行单元存在对共享

    2024年02月09日
    浏览(31)
  • 华为OD机试 - 需要打开多少监控器(Java & JS & Python)

    题目描述 某长方形停车场,每个车位上方都有对应监控器,当且仅当在当前车位或者前后左右四个方向任意一个车位范围停车时,监控器才需要打开; 给出某一时刻停车场的停车分布,请统计最少需要打开多少个监控器; 输入描述 第一行输入m,n表示长宽,满足1 m,n = 20;

    2024年02月11日
    浏览(32)
  • 【NVIDIA】Jetson Orin Nano系列:安装 Qt6、firefox、jtop、flameshot

    qtcreator 直接使用 sudo apt install firefox 安装时,会使用snap来安装,经常因为网络不好而卡死,下面使用官方的源来安装deb版本的firefox 注意:不要使用 sudo apt install 安装 jtop,要使用pip3来安装

    2024年01月23日
    浏览(36)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包