国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

Qt-OpenCV學(xué)習(xí)筆記--人臉識別

這篇具有很好參考價值的文章主要介紹了Qt-OpenCV學(xué)習(xí)筆記--人臉識別。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

前言

本人從事機械設(shè)計12年,業(yè)余時間自學(xué)編程。

2022年4月6日,開始學(xué)習(xí)C#,

2022年9月7日,開始學(xué)習(xí)c++和Qt,

2022年10月28日,開始學(xué)習(xí)OpenCV,

今天終于搞定了傳說中的 人臉識別?,在此,做個記錄。

人臉檢測,是基于Haar特征的cascade分類器,

人臉識別,是基于LDA理論的Fisherface算法。

話不多說,上視頻?。–SDN上傳的視頻,太清晰?。?/p>

人臉識別測試程序

測試代碼

FaceRecognition.pro

QT       += core gui

greaterThan(QT_MAJOR_VERSION, 4): QT += widgets

CONFIG += c++11

# 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 \
    sm.cpp \
    widget.cpp

HEADERS += \
    sm.h \
    widget.h

FORMS += \
    widget.ui

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

unix|win32: LIBS += -L$$PWD/../../../../../opencv/install/x64/mingw/lib/ -llibopencv_world460.dll

INCLUDEPATH += $$PWD/../../../../../opencv/install/include
DEPENDPATH += $$PWD/../../../../../opencv/install/include

sm.h

#ifndef SM_H
#define SM_H

#include <iostream>
#include "opencv2/core.hpp"



class sm
{
public:
    sm();

    //讀取文件
    static void read_csv(const std::string& filename, std::vector<cv::Mat>& images, std::vector<int>& labels, char separator);

    //圖像預(yù)處理:檢測人臉、裁剪、縮放、保存、生成列表
    static void pretreatment(std::vector<cv::Mat> images, std::vector<int> labels,std::string path,int width,int height);

};

#endif // SM_H

widget.h

#ifndef WIDGET_H
#define WIDGET_H

#include <QWidget>

QT_BEGIN_NAMESPACE
namespace Ui { class Widget; }
QT_END_NAMESPACE

class Widget : public QWidget
{
    Q_OBJECT

public:
    Widget(QWidget *parent = nullptr);
    ~Widget();

private slots:
    void on_pushButton_clicked();

    void on_pushButton_7_clicked();

    void on_pushButton_2_clicked();

    void on_pushButton_3_clicked();

    void on_pushButton_5_clicked();

    void on_pushButton_6_clicked();

private:
    Ui::Widget *ui;
};
#endif // WIDGET_H

main.cpp

#include "widget.h"

#include <QApplication>

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    Widget w;
    w.show();
    return a.exec();
}

sm.cpp

#include "sm.h"

//引用依賴
#include "opencv2/core.hpp"
#include "opencv2/face.hpp"
#include "opencv2/highgui.hpp"
#include "opencv2/imgproc.hpp"
#include <iostream>
#include <fstream>
#include <sstream>

#include <QDebug>

sm::sm()
{

}

void sm::pretreatment(std::vector<cv::Mat> images, std::vector<int> labels, std::string path, int width, int height)
{
    cv::Mat dst_shear;
    cv::Mat dst_resize;

    //創(chuàng)建級聯(lián)分類器
    cv::CascadeClassifier cascade;
    //載入Haar特征分類器
    cascade.load("C:/opencv/date/haarcascade_frontalface_default.xml");
    //創(chuàng)建矩形容器
    std::vector<cv::Rect> rects;
    //遍歷
    int flag=1;
    for(uint i=0;i<images.size();i++)
    {
        //人臉檢測
        cascade.detectMultiScale(images[i],rects);
        //裁剪
        dst_shear = images[i](rects[0]).clone();
        //縮放
        resize(dst_shear,dst_resize,cv::Size(width,height),0,0,cv::INTER_AREA);
        //保存路徑拼接
        std::string im_path1 = std::to_string(labels[i]);
        std::string im_path2 = std::to_string(flag);
        flag++;
        if(labels[i+1]!=labels[i])
        {
            flag=1;
        }
        std::string im_path3 = ".png";
        std::string im_path = path+im_path1+"-"+im_path2+im_path3;

        //調(diào)試
        QString qstr_im = QString::fromStdString(im_path);
        qDebug()<<qstr_im;

        //保存
        imwrite(im_path,dst_resize);
        //顯示
        //std::string str = std::to_string(i);
        //imshow(str,dst_resize);
        //生成列表文件
        std::string list_name = "list.txt";
        std::string list_path = path + list_name;

        //調(diào)試
        QString qstr_list = QString::fromStdString(list_path);
        qDebug()<<qstr_list;

        std::ofstream list(list_path, std::ios::app);
        if (list.fail())
        {
            qDebug()<<"list文件打開失敗,請檢查文件路徑!";
        }
        else
        {
            list<<im_path;
            list<<";";
            list<<im_path1;
            list<<"\n";
        }
    }
}

void sm::read_csv(const std::string &filename, std::vector<cv::Mat> &images, std::vector<int> &labels, char separator)
{
    //以只讀方式讀取文件
    std::ifstream file(filename, std::ios::in);
    if (!file)
    {
        qDebug()<<"文件打開失敗,請檢查文件路徑!";        
    }
    else
    {
        //逐行讀取文本,分離路徑和標簽
        std::string line, path, classlabel;
        //逐行讀取
        while (getline(file, line))
        {
            //將讀取到的文本轉(zhuǎn)為字符串流
            std::stringstream stream(line);
            //分離路徑
            getline(stream, path, separator);
            //分離標簽
            getline(stream, classlabel);
            //若分離成功,則按照路徑載入圖像,設(shè)置標簽
            if(!path.empty() && !classlabel.empty())
            {
                images.push_back(cv::imread(path,0));
                labels.push_back(atoi(classlabel.c_str()));
            }
        }
    }
}

widget.cpp

#include "widget.h"
#include "ui_widget.h"

//引用
#include "sm.h"

#include "opencv2/core.hpp"
#include "opencv2/face.hpp"
#include "opencv2/highgui.hpp"
#include "opencv2/imgproc.hpp"

#include <iostream>
#include <fstream>
#include <sstream>

#include <QFileDialog>
#include <QDebug>
#include <QMessageBox>
#include <qdatetime.h>

//進行人臉識別的路徑
QString face_path;

Widget::Widget(QWidget *parent)
    : QWidget(parent)
    , ui(new Ui::Widget)
{
    ui->setupUi(this);
}

Widget::~Widget()
{
    delete ui;
}

//選擇文件
void Widget::on_pushButton_clicked()
{
    QString filename = QFileDialog::getOpenFileName(this,"請選擇列表文件",".","*.txt");
    if(!filename.isEmpty())
        {
            ui->lineEdit->setText(filename);

        }
}

//選擇保存目錄
void Widget::on_pushButton_7_clicked()
{
    QString dir = QFileDialog::getExistingDirectory(this,"請選擇保存目錄",".");
    if(!dir.isEmpty())
        {
            QString str = dir + "/";
            ui->lineEdit_3->setText(str);

        }
}

//訓(xùn)練模型
void Widget::on_pushButton_2_clicked()
{
    //獲取文件路徑
    std::string src_filename = ui->lineEdit->text().toStdString();
    if(src_filename.empty())
    {
        QMessageBox::warning(this,"警告","圖像載入失敗,請檢查文件路徑!");
        return;
    }
    //圖像集合
    std::vector<cv::Mat> src_images;
    //標簽集合
    std::vector<int> src_labels;
    //加載文件
    sm::read_csv(src_filename,src_images,src_labels,';');
    //判斷讀取是否成功
    if(src_images.size()<=1||src_labels.size()<=1)
    {        
        QMessageBox::warning(this,"警告","數(shù)據(jù)量不足,請檢查數(shù)據(jù)列表!");
        return;
    }

    //調(diào)試
    qDebug()<<src_images.size();
    qDebug()<<src_labels.size();

    //獲取圖像保存路徑
    std::string dst_path = ui->lineEdit_3->text().toStdString();
    if(dst_path.empty())
    {
        QMessageBox::warning(this,"警告","請檢查文件保存路徑!");
        return;
    }
    //圖像預(yù)處理,生成新文件
    sm::pretreatment(src_images,src_labels,dst_path,100,100);

    //獲取新文件路徑
    std::string dst_filename = dst_path+"list.txt";
    //新圖像集合
    std::vector<cv::Mat> dst_images;
    //新標簽集合
    std::vector<int> dst_labels;
    //重新加載文件
    sm::read_csv(dst_filename,dst_images,dst_labels,';');

    // 創(chuàng)建模型
    cv::Ptr<cv::face::FisherFaceRecognizer> model = cv::face::FisherFaceRecognizer::create();
    // 訓(xùn)練模型
    model->train(dst_images, dst_labels);
    //保存模型
    model->write(dst_path+"model.xml");

    //提示
    QMessageBox::information(this,"消息","模型訓(xùn)練完成!");

}

//選擇模型路徑
void Widget::on_pushButton_3_clicked()
{
    QString filename = QFileDialog::getOpenFileName(this,"請選擇模型",".","*.xml");
    if(!filename.isEmpty())
        {
            ui->lineEdit_2->setText(filename);

        }
}

//選擇需要識別的圖像,縮放,保持比例,顯示
void Widget::on_pushButton_5_clicked()
{
    face_path = QFileDialog::getOpenFileName(this,"選擇一個圖片",".","*.jpg *.png *.bmp");
    if(!face_path.isEmpty())
    {
        //加載圖像
        QPixmap* pix= new QPixmap;
        pix->load(face_path);
        //圖像縮放
        QPixmap* npix= new QPixmap;
        *npix = pix->scaled(ui->label_4->size(),Qt::KeepAspectRatio);
        //顯示
        ui->label_4->setPixmap(*npix);

    }

}

//人臉識別
void Widget::on_pushButton_6_clicked()
{
    cv::Mat src,
            dst_shear,
            dst_resize;


    //創(chuàng)建級聯(lián)分類器
    cv::CascadeClassifier cascade;
    //載入Haar特征分類器
    cascade.load("C:/opencv/date/haarcascade_frontalface_default.xml");

    //加載圖像
    if(face_path.isEmpty())
    {
        QMessageBox::warning(this,"警告","請先選擇一個圖像!");
        return;
    }
    else
    {
        src = cv::imread(face_path.QString::toStdString(),0);
    }

    //創(chuàng)建矩形容器
    std::vector<cv::Rect> rects;
    //識別人臉
    cascade.detectMultiScale(src,rects);

    //裁剪圖像
    dst_shear = src(rects[0]).clone();

    //縮放
    cv::resize(dst_shear,dst_resize,cv::Size(100,100),0,0,cv::INTER_AREA);

    if(ui->lineEdit_2->text().isEmpty())
    {
        QMessageBox::warning(this,"警告","請檢查模型加載路徑!");
    }
    else
    {
        // 創(chuàng)建模型
        cv::Ptr<cv::face::FisherFaceRecognizer> model = cv::face::FisherFaceRecognizer::create();
        //載入訓(xùn)練好的模型
        model->read(ui->lineEdit_2->text().QString::toStdString());

        //進行識別
        int predictedLabel;
        double confidence;
        model->predict(dst_resize,predictedLabel,confidence);

        //打印結(jié)果
        QDateTime cur = QDateTime::currentDateTime();

        QString str;
        switch (predictedLabel)
        {
            case 1:
                str = "周敏慧";
                break;
            case 2:
                str = "林志玲";
                break;
            case 3:
                str = "黃渤";
                break;
            case 4:
                str = "單大偉";
                break;
            default:
                str = "這個人我不認識!";
        }

        ui->textBrowser->append(cur.toString("yyyy-MM-dd hh:mm:ss"));
        ui->textBrowser->append(str);
    }
}

widget.ui

Qt-OpenCV學(xué)習(xí)筆記--人臉識別

測試結(jié)果

Qt-OpenCV學(xué)習(xí)筆記--人臉識別

? ? ? ? 綜上,將導(dǎo)入的圖像進行裁剪和縮放,僅保存人臉部分,用于訓(xùn)練模型;然后加載訓(xùn)練好的模型,進行人臉識別,最后將識別的信息予以顯示。

? ? ? ? 代碼經(jīng)過修改,可以用于 門禁系統(tǒng) 或者 人臉打卡 。文章來源地址http://www.zghlxwxcb.cn/news/detail-484898.html

到了這里,關(guān)于Qt-OpenCV學(xué)習(xí)筆記--人臉識別的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實不符,請點擊違法舉報進行投訴反饋,一經(jīng)查實,立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費用

相關(guān)文章

  • 簡易版人臉識別qt opencv

    簡易版人臉識別qt opencv

    1、配置文件.pro 2、頭文件 3、源文件 main.app widget.cpp 4、ui界面

    2024年02月09日
    瀏覽(15)
  • QT連接OpenCV庫實現(xiàn)人臉識別

    圖像容器: Mat類 讀取圖像: ? 命名展示圖像的窗口: 展示圖像: 示例: 視頻流類: VideoCapture 打開視頻: 若想要打開攝像頭只需在構(gòu)造時,調(diào)用構(gòu)造函數(shù)參數(shù)傳遞0即可 讀取視頻流中圖像: ?圖像翻轉(zhuǎn): 休眠阻塞函數(shù): 示例: 灰度處理: 均衡化處理: 示例: opencv級聯(lián)

    2024年02月09日
    瀏覽(23)
  • OpenCV+ Qt Designer 開發(fā)人臉識別考勤系統(tǒng)

    OpenCV+ Qt Designer 開發(fā)人臉識別考勤系統(tǒng)

    本系統(tǒng)是一個基于OpenCV和 Qt Designer 的人臉識別考勤系統(tǒng),主要功能是自動識別攝像頭中的人臉,并把人臉對應(yīng)的姓名和打卡時間存儲到數(shù)據(jù)庫中,方便管理人員進行考勤管理。本系統(tǒng)使用 face_recognition 庫進行人臉識別,使用 PyQt5 開發(fā)界面,然后把界面與代碼進行整合。 系統(tǒng)

    2024年02月06日
    瀏覽(23)
  • OpenCV+Ubuntu+QT實現(xiàn)人臉檢測/識別(考勤管理)

    OpenCV+Ubuntu+QT實現(xiàn)人臉檢測/識別(考勤管理)

    下載完成后在下載目錄打開終端,賦予可執(zhí)行權(quán)限,再執(zhí)行即可安裝qt sudo chmod +x qt-opensource-linux-x64-5.12.8.run 可參考文章 若按照上述方法安裝好opencv,創(chuàng)建測試項目,在pro文件中加入: 測試: (若出現(xiàn)警告 “VIDEOIO(V4L2:/dev/video0): select() timeout”,在虛擬機-設(shè)置-USB控制器,更

    2024年01月22日
    瀏覽(23)
  • (項目筆記)opencv人臉識別

    (項目筆記)opencv人臉識別

    Haar級聯(lián): Haar特征:邊緣特征,線性特征,中心環(huán)繞特征,對角線特征 這些特征組合為特征模板,特征模板里有白色和黑色矩形,模板特征即為白色矩形像素和減去黑色矩形像素和。 Haar 特征的提取簡單說就是通過不斷改變模版的大小、位置和類型,白色矩形區(qū)域像素和‘減

    2024年02月05日
    瀏覽(23)
  • opencv系列(1)--使用opencv和Qt6做一個視頻監(jiān)控器人臉識別

    這個程序是自己的下班之后,看看那個壞東西想來偷看我的電腦。我就隨手做的一個程序。 1.能都顯示攝像頭的內(nèi)容。 2.如果有人進入攝像頭。 3.利用opencv的模型識別人臉,識別到了就保存到自己的電腦里面。 4.并把他的照片顯示到界面上一段時間,告訴他,偷窺有罪。 5.程

    2024年02月11日
    瀏覽(22)
  • 嵌入式Linux:ARM驅(qū)動+QT應(yīng)用+OpenCV人臉識別項目實現(xiàn)

    嵌入式Linux:ARM驅(qū)動+QT應(yīng)用+OpenCV人臉識別項目實現(xiàn)

    ? ? ? ? 這個項目主要分為兩部分,客戶端(ARM板端)負責(zé)利用OpenCV采集人臉數(shù)據(jù),利用TCP將人臉數(shù)據(jù)發(fā)送給服務(wù)器,然后服務(wù)器根據(jù)人臉數(shù)據(jù)進行人臉識別,將識別后的結(jié)果返還給客戶端,客戶端對人臉數(shù)據(jù)進行解析,得到正確的人臉數(shù)據(jù)后,打開門鎖。門鎖涉及硬件操作

    2024年02月10日
    瀏覽(33)
  • 【深度學(xué)習(xí)】基于Qt的人臉識別系統(tǒng),門禁人臉識別系統(tǒng),Python人臉識別流程,樹莓派

    【深度學(xué)習(xí)】基于Qt的人臉識別系統(tǒng),門禁人臉識別系統(tǒng),Python人臉識別流程,樹莓派

    在深度學(xué)習(xí)領(lǐng)域做人臉識別的識別準確率已經(jīng)高到超出人類識別,但綜合考慮模型復(fù)雜度(推理速度)和模型的識別效果,這個地方還是有做一些工作的需求的。 人臉識別的過程基本由下面的流程組成。 yolov5-face、yolov7-face等github項目都可以做到這一點,在公開數(shù)據(jù)集上訓(xùn)練

    2024年02月09日
    瀏覽(25)
  • 人臉識別實戰(zhàn):使用Python OpenCV 和深度學(xué)習(xí)進行人臉識別

    人臉識別實戰(zhàn):使用Python OpenCV 和深度學(xué)習(xí)進行人臉識別

    首先簡要討論基于深度學(xué)習(xí)的面部識別的工作原理,包括“深度度量學(xué)習(xí)”的概念。 然后,我將幫助您安裝實際執(zhí)行人臉識別所需的庫。 最后,我們將為靜止圖像和視頻流實現(xiàn)人臉識別。 安裝人臉識別庫 ================================================================== 為了使用 Python 和

    2024年04月09日
    瀏覽(94)
  • 競賽選題 基于深度學(xué)習(xí)的人臉性別年齡識別 - 圖像識別 opencv

    競賽選題 基于深度學(xué)習(xí)的人臉性別年齡識別 - 圖像識別 opencv

    ?? 優(yōu)質(zhì)競賽項目系列,今天要分享的是 ?? 畢業(yè)設(shè)計 人臉性別年齡識別系統(tǒng) - 圖像識別 opencv 該項目較為新穎,適合作為競賽課題方向,學(xué)長非常推薦! ??學(xué)長這里給一個題目綜合評分(每項滿分5分) 難度系數(shù):3分 工作量:3分 創(chuàng)新點:3分 ?? 更多資料, 項目分享: https

    2024年02月07日
    瀏覽(95)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包