基于Qt的OpenCV人脸识别(四)

上篇进行了人脸的检测,现在进行人脸的识别,采用OpenCV的face320模块里的EigenFace算法。在进行检测之间,得制作被检测人的人脸数据,这是捕获按钮就起到了作用,进行人脸数据的拍摄,

//拍摄人脸
void Widget::on_btn_cap_clicked()
{
    Mat dst;
    for (int i = 0; i < faces.size(); i++)
    {
       cv::resize(frame(faces[i]), dst, Size(92, 112));
       cvtColor(dst,dst,COLOR_BGR2RGB);
       imwrite(format("../myFace/%d.jpg", count), dst);
       count++;
    }
}
如代码所示,拍摄的人脸数据大小都为112*92,拍摄10到20张图片,进行数据筛选,选则好的数据集进行训练,然后进行实时监测,同样在打开摄像头槽函数中添加代码:
//延时函数
void Widget::Sleep(int msec)
{
    QTime dieTime = QTime::currentTime().addMSecs(msec);
    while( QTime::currentTime() < dieTime )
        QCoreApplication::processEvents(QEventLoop::AllEvents, 100);
}

//打开摄像头
void Widget::on_btn_open_clicked()
{
    //打开摄像头
    if (capture.isOpened())
           return;
    capture.open(0);
    if(capture.isOpened())
    {
        //int rate= capture.get(CV_CAP_PROP_FPS);  //获取帧率
        //qDebug() << "rate=" << rate;
        for(;;)
        {
            capture >> frame;
            flip(frame, frame, 1);  //画面翻转
            if (!frame.empty())
            {

                //人脸检测
                Mat frame_gray;
                Mat dst;
                Mat testSample;
                cvtColor(frame, frame_gray, COLOR_BGR2GRAY);
                equalizeHist(frame_gray, frame_gray);
                faceDetector.detectMultiScale(frame_gray, faces, 1.1, 2, 0 | CASCADE_SCALE_IMAGE, Size(30, 30));
                for (int i = 0; i < faces.size(); i++)
                {
                    Mat roi = frame(faces[i]);
                    cvtColor(roi, dst, COLOR_BGR2GRAY);
                    cv::resize(dst, testSample, Size(92, 112));
                    int label = model->predict(testSample);
                    rectangle(frame, faces[i], Scalar(0, 0, 255), 2, 8, 0);
                    putText(frame, format("i'm %s", (label == 36 ? "Howard" : "Unknow")),
                            faces[i].tl(), FONT_HERSHEY_PLAIN, 1.0, Scalar(0, 0, 255), 2, 8);
                    //qDebug() << "label:" << label;
                }
                //显示
                image = Mat2QImage(frame);
                ui->label->setPixmap(QPixmap::fromImage(image));
            }
            Sleep(2); //延时2ms
        }
    }
}

 注意点:

  1.  face属于OpenCV拓展模块,因此在头文件中要加入#include <opencv2/face.hpp>
  2. 训练的数据大小要一致,拍摄时表情可变化,但最好位置不要移动

最后的结果如下:

最后附上整个工程代码: https://download.csdn.net/download/huhuandk/10821182

 

  • 5
    点赞
  • 81
    收藏
    觉得还不错? 一键收藏
  • 10
    评论
评论 10
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值