在好例子网,分享、交流、成长!
您当前所在位置:首页Others 开发实例一般编程问题 → 基于qt+opencv的人脸识别

基于qt+opencv的人脸识别

一般编程问题

下载此实例
  • 开发语言:Others
  • 实例大小:0.15M
  • 下载次数:71
  • 浏览次数:1254
  • 发布时间:2019-10-22
  • 实例类别:一般编程问题
  • 发 布 人:robot666
  • 文件格式:.zip
  • 所需积分:2
 相关标签:

实例介绍

【实例简介】基于qt opencv的人脸识别代码,输入人脸、训练、识别人脸 qt opencv

【实例截图】

from clipboard

【核心代码】

#include "dialogin.h"
#include "ui_dialogin.h"

Dialogin::Dialogin(QWidget *parent) :
    QDialog(parent),
    ui(new Ui::Dialogin)
{

    ui->setupUi(this);
    i=0;
    capture = NULL;
     capture = cvCaptureFromCAM(0);
             cvSetCaptureProperty(capture, CV_CAP_PROP_FRAME_WIDTH, 640);
             cvSetCaptureProperty(capture, CV_CAP_PROP_FRAME_HEIGHT, 480);
    setWindowFlags(windowFlags()&~ Qt::WindowCloseButtonHint);
    //gimage =NULL;
   // connect(this, SIGNAL(getimage(const QImage &image)), this, SLOT(showimage(const QImage &image)));
    timer = new QTimer(this);
    timer->setInterval(50);
    connect(timer, SIGNAL(timeout()), this, SLOT(showimage()));
    timer->start();
}

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

void Dialogin::Sleep(int msec)
{
    QTime dieTime = QTime::currentTime().addMSecs(msec);
       while( QTime::currentTime() < dieTime )
           QCoreApplication::processEvents(QEventLoop::AllEvents, 100);
}
void Dialogin::on_pushButton_photo_clicked()
{

  // qDebug() << ui->pushButton_photo->text() << endl;

    if(ui->lineEdit_name->text() == NULL)
    {
        QMessageBox::warning(this,tr("错误"),tr("请输入姓名"),QMessageBox::Ok);
    }
    else
    {
        if(capture == NULL)
        {
            QMessageBox::warning(this, tr("警告!!!"), tr("摄像头打不开!!!!"), QMessageBox::Abort);
            return;
        }
        QDir *path = new QDir;
        bool exist = path->exists(QDir::currentPath()   "/TEMP");


        if(!exist)
        {
            bool ok = path->mkdir(QDir::currentPath()   "/TEMP");
            if(ok)
            {
                QMessageBox::warning(this,tr("创建文件夹"),tr("文件夹创建成功!"));
            }
        }
        QString temp =  QDir::currentPath()   "/TEMP/%d.jpg";
        char * path_src;
        QByteArray ba= temp.toLatin1();
        path_src = ba.data();




        frame = cvQueryFrame( capture );

        std::string filename = cv::format(path_src, i);
        ui->pushButton_photo->setText(QString::number(i 1,10));
        imwrite(filename, frame);
        i  ;

    }
}

void Dialogin::on_pushButton_start_photo_clicked()
{
    QMessageBox *startbox = new QMessageBox(QMessageBox::Warning  ,"信息","开始取样请稍后!!!",QMessageBox::NoButton,this);
    startbox->show();
    Sleep(1000);
    QFile user(QDir::currentPath()   "/usr.txt");
    if(!user.open(QIODevice::ReadWrite | QIODevice::Text))
    {
        startbox->close();
        qDebug() << user.errorString() <<endl;
    }
    qint64 usrlinenum =0;
    usrlinenum=1;
    while(!user.atEnd())
    {
        char buf[128];
        qint64 c = user.readLine(buf, sizeof(buf));

        if(c > 0)
        {
            usrlinenum  ;
            qDebug() << buf <<endl;
        }
        if(c <0 )
        {
            startbox->close();
            QMessageBox::warning(this,tr("文件读取"),tr("文件读取失败!!!"));
            return;
        }
    }
    // qDebug() << QString::number(i, 10) <<endl;
    QString usrline = QString::number(usrlinenum, 10)    ";"    ui->lineEdit_name->text()   "\r\n";
    qDebug() << usrline <<endl;


    char * p;
    QByteArray buf = usrline.toLatin1();
    p = buf.data();
    user.write(p);
    user.close();

    QDir *pathdata = new QDir;
    bool exist = pathdata->exists(QDir::currentPath()   "/"  QString::number(usrlinenum, 10) );
    if(!exist)
    {
        bool ok =  pathdata->mkdir(QDir::currentPath()   "/"  QString::number(usrlinenum, 10));
        if(!ok)
        {
            QMessageBox::warning(this,tr("创建文件夹失败"),tr("文件夹创建失败!"));
            startbox->close();
            return;
        }

    }
    QString pathdst = QDir::currentPath()   "/"  QString::number(usrlinenum, 10)   "/";
    /*********************************************************************************************/

    cv::CascadeClassifier face_Classifier;   //定义人脸分类器
    std::string face_Classifier_name = "./haarcascade_frontalface_alt.xml";


    std::vector<cv::Rect> face_rect;
    cv::Mat dst_gray;

    if (!face_Classifier.load(face_Classifier_name))
    {
        startbox->close();
        QMessageBox::warning(this,tr("错误"),tr("haarcascade_frontalface_alt.xml加载失败"),QMessageBox::Ok);
        return;
    }


    QString dst_path = pathdst   "%d.jpg";


    QDir dir(QDir::currentPath()   "/TEMP/");
    QStringList dst_file_name;
    dst_file_name << "*.jpg" ;

    QFileInfoList list = dir.entryInfoList(dst_file_name, QDir::Files|QDir::Readable, QDir::Name);

    qDebug() << list.size() << endl;

    char * path_dst;
    QByteArray dsttemp= dst_path.toLatin1();
    path_dst = dsttemp.data();
    for(int z=0;z< list.size();z  )
    {

        char *  path_list_src ;

        QByteArray dsttemp=  list[z].absoluteFilePath().toLatin1();
        path_list_src = dsttemp.data();

        std::string srcfile = cv::format(path_list_src);
        std::string dstfile = cv::format( path_dst, z);
        cv::Mat srcframe = cv::imread(srcfile);
        cv::cvtColor(srcframe, dst_gray, cv::COLOR_BGR2GRAY);
        cv::equalizeHist(dst_gray, dst_gray);

        face_Classifier.detectMultiScale(dst_gray,  face_rect, 1.1, 3, CV_HAAR_DO_ROUGH_SEARCH, cv::Size(30, 30));
        for (int j = 0; j < (int)face_rect.size(); j  )
        {
            cv::Mat faceROI = srcframe(face_rect[j]);
            cv::Mat MyFace;
            cv::Mat gray_MyFace;
            if (faceROI.cols > 100)
            {
                cv::resize(faceROI, MyFace, cv::Size(92, 112));
                cv::cvtColor(MyFace, gray_MyFace, CV_BGR2GRAY);
                imwrite(dstfile, gray_MyFace);
            }
        }


    }
    /***********************************************************************************************************/
    QFile csv(QDir::currentPath()   "/csv.txt");
    if(!csv.open(QIODevice::WriteOnly | QIODevice::Append | QIODevice::Text))
    {
        qDebug() << csv.errorString() << endl;
        startbox->close();
        QMessageBox::warning(this,tr("错误"),tr("无法创建csv文件!!!"),QMessageBox::Ok);
        return;
    }
    QDir dst_file_dir(pathdst);
    QStringList dst_file_filter;
    dst_file_filter <<  "*.jpg" ;
    QFileInfoList dst_file_list_path = dst_file_dir.entryInfoList(dst_file_filter, QDir::Files | QDir::Readable, QDir::Name);
    for(int x=0; x<dst_file_list_path.size(); x  )
    {
        csv.write(QString(dst_file_list_path[x].absoluteFilePath()   ";"   QString::number(usrlinenum, 10)   "\r\n").toLatin1());
    }
    startbox->close();
    QMessageBox::warning(this,tr("信息"),tr("取样已经完成、csv文件完创建成!!!"),QMessageBox::Ok);
}

void Dialogin::on_pushButton_close_clicked()
{

    ui->lineEdit_name->setEnabled(true);
    ui->pushButton_start_photo->setEnabled(true);
    ui->lineEdit_name->clear();
    if(capture != NULL)
    {
        cvReleaseCapture(&capture);
    }
    this->close();
}

void Dialogin::showimage()
{
    if(capture != NULL)
    {
        cv::Mat src ;
        src = cvQueryFrame( capture );
        //格式转换否则无法正常显示图片
        cvtColor( src, src, CV_BGR2RGB );

        QImage img=QImage((const unsigned char*)(src.data), src.cols, src.rows, QImage::Format_RGB888);

        QPixmap pix = QPixmap::fromImage(img);
        ui->label_video->setPixmap(pix);
    }

}


标签:

实例下载地址

基于qt+opencv的人脸识别

不能下载?内容有错? 点击这里报错 + 投诉 + 提问

好例子网口号:伸出你的我的手 — 分享

网友评论

发表评论

(您的评论需要经过审核才能显示)

查看所有0条评论>>

小贴士

感谢您为本站写下的评论,您的评论对其它用户来说具有重要的参考价值,所以请认真填写。

  • 类似“顶”、“沙发”之类没有营养的文字,对勤劳贡献的楼主来说是令人沮丧的反馈信息。
  • 相信您也不想看到一排文字/表情墙,所以请不要反馈意义不大的重复字符,也请尽量不要纯表情的回复。
  • 提问之前请再仔细看一遍楼主的说明,或许是您遗漏了。
  • 请勿到处挖坑绊人、招贴广告。既占空间让人厌烦,又没人会搭理,于人于己都无利。

关于好例子网

本站旨在为广大IT学习爱好者提供一个非营利性互相学习交流分享平台。本站所有资源都可以被免费获取学习研究。本站资源来自网友分享,对搜索内容的合法性不具有预见性、识别性、控制性,仅供学习研究,请务必在下载后24小时内给予删除,不得用于其他任何用途,否则后果自负。基于互联网的特殊性,平台无法对用户传输的作品、信息、内容的权属或合法性、安全性、合规性、真实性、科学性、完整权、有效性等进行实质审查;无论平台是否已进行审查,用户均应自行承担因其传输的作品、信息、内容而可能或已经产生的侵权或权属纠纷等法律责任。本站所有资源不代表本站的观点或立场,基于网友分享,根据中国法律《信息网络传播权保护条例》第二十二与二十三条之规定,若资源存在侵权或相关问题请联系本站客服人员,点此联系我们。关于更多版权及免责申明参见 版权及免责申明

;
报警