百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 技术文章 > 正文

OpenCV使用EigenFaceRecognizer来实现人脸识别

haoteby 2025-05-02 18:27 36 浏览

1、概述

  案例:使用EigenFaceRecognizer来实现人脸识别算法

  实现步骤:

    1.准备人脸数据(人脸和人脸对应的标签),ps:预留一个或几个样本用来测试

    2.将样本数据和样本对应的标签数据从文件中读取出来并分别存入集合

    3.实例化EigenFaceRecognizer

    4.将准备好的人脸集合和标签集合放入EigenFaceRecognizer.train函数中进行训练

    5.训练好数据后执行predict方法进行预测

    6.假如预留样本的标签值与执行predict预测后的标签值是一致的就说明我们预测成功了。

  ps:使用这个算法来实现人脸识别时样本图像和实际的图像大小必须要要一致,否则算法会出现不工作的情况。

2、代码示例

Face_Eigen_Face_Recognizer::Face_Eigen_Face_Recognizer(QWidget *parent)
    : MyGraphicsView{parent}
{
    this->setWindowTitle("特征脸识别器");
    QPushButton * btn = new QPushButton(this);
    btn->setText("读取数据");
    connect(btn,&QPushButton::clicked,[=](){
        QString srcDirPath = QFileDialog::getExistingDirectory(
                    this, "choose src Directory",
                    "/Users/yangwei/Documents/tony/opencv/orl_faces");
        if (srcDirPath.isEmpty())
        {
            return;
        }
        else
        {
            string filename = string("/Users/yangwei/Documents/tony/opencv/orl_faces/targetData.txt");
            out.open(filename,ios::out);
            qDebug() << "srcDirPath=" << srcDirPath;
            srcDirPath += "/";
            prepareImageData(srcDirPath.toStdString().c_str(),"");
            out.close();
        }

    });




    QPushButton *btnShow = new QPushButton(this);
    btnShow->move(0,btn->y()+btn->height()+5);
    btnShow->setText("开始检测特征脸");
    connect(btnShow,&QPushButton::clicked,[=](){
        showEgenFaceRecoginzer("");
    });

}

void Face_Eigen_Face_Recognizer::dropEvent(QDropEvent *event){
    path = event->mimeData()->urls().at(0).toLocalFile();
    showEgenFaceRecoginzer(path.toStdString().c_str());
}

void Face_Eigen_Face_Recognizer::showEgenFaceRecoginzer(const char * filePath){
    string filename = string("/Users/yangwei/Documents/tony/opencv/orl_faces/targetData.txt");
    ifstream file(filename,ifstream::in);
    string line,path,classLabel;//行、路径、标签
    vector<Mat> images;
    vector<int> labels;
    while(getline(file,line)){

        stringstream liness(line);
        getline(liness,path,' ');
        getline(liness,classLabel);
        //        if (!path.empty() && !labels.empty()) {
        cout << "path :"<< classLabel.c_str()<<endl;;
        images.push_back(imread(path, 0));
        labels.push_back(atoi(classLabel.c_str()));
        //        }
    }
    file.close();
    if (images.size() < 1 || labels.size() < 1) {
        qDebug()<<"invalid image path...\n";
        return;
    }

    int width = images[0].cols;
    int height = images[0].rows;
    cout << "width:"<<width<<"|"<<"height:"<<height<<endl;
    //准备测试数据和测试label
    Mat testMatSample = images[images.size()-1];
    int testLabel = labels[labels.size()-1];
    imshow("testMatSample",testMatSample);
    images.pop_back();
    labels.pop_back();

    //接下来就是最重要的步骤
    //1.训练
    Ptr<BasicFaceRecognizer> model = EigenFaceRecognizer::create();
    model->train(images,labels);
    //2.预测
    int predictedLabel = model->predict(testMatSample);

    //此处如果样本和预测结果是一致的就说明此次识别是算法是成功的
    cout << "testLabel:"<<testLabel<<endl;
    cout <<"predictedLabel:"<<predictedLabel<<endl;

    //从训练结果中获取均值、特征向量、特征值矩阵
    Mat eigenvalues = model->getEigenValues();
    Mat eigenvectors = model->getEigenVectors();
    Mat mean = model->getMean();
    //得到均值脸
    Mat meanFace = mean.reshape(1,height);
    Mat dst;
    //归一化0~255并输出
    if(meanFace.channels()==1){//单通道图像
        normalize(meanFace,dst,0,255,NORM_MINMAX,CV_8UC1);
    }else{//多通道图像
        normalize(meanFace,dst,0,255,NORM_MINMAX,CV_8UC3);
    }
    imshow("dist",dst);

//    //输出特征脸
//    for (int i = 0; i < min(16, eigenvectors.cols); i++) {
//        Mat ev = eigenvectors.col(i).clone();
//        Mat grayscale;
//        Mat eigenFace = ev.reshape(1, height);
//        if (eigenFace.channels() == 1) {
//            normalize(eigenFace, grayscale, 0, 255, NORM_MINMAX, CV_8UC1);
//        }
//        else if (eigenFace.channels() == 3) {
//            normalize(eigenFace, grayscale, 0, 255, NORM_MINMAX, CV_8UC3);
//        }
//        Mat colorface;
//        applyColorMap(grayscale, colorface, COLORMAP_BONE);
//        char* winTitle = new char[128];
//        sprintf(winTitle, "eigenface_%d", i);
//        imshow(winTitle, colorface);
//    }

//    for (int num = 0; num < min(eigenvectors.cols, 16); num++) {
//            Mat evs = eigenvectors.col(num);
//            Mat projection = LDA::subspaceProject(evs, mean, images[0].reshape(1, 1));
//            Mat reconstruction = LDA::subspaceReconstruct(evs, mean, projection);

//            Mat result = reconstruction.reshape(1, height);
//            if (result.channels() == 1) {
//                normalize(result, reconstruction, 0, 255, NORM_MINMAX, CV_8UC1);
//            }
//            else if (result.channels() == 3) {
//                normalize(result, reconstruction, 0, 255, NORM_MINMAX, CV_8UC3);
//            }
//            char* winTitle = new char[128];
//            sprintf(winTitle, "recon_face_%d", num);
//            imshow(winTitle, reconstruction);
//        }

//        QT开发交流+赀料君羊:714620761


}

3、演示图像

  预测结果:

相关推荐

谷歌开源大模型评测框架正式发布,AI模型评测难题迎刃而解

近日科技巨头谷歌正式推出其开源大模型评测框架LMEval,这一创新工具为全球AI开发者和企业提供了标准化的模型评估解决方案。LMEval的发布不仅标志着AI模型评测迈入透明化时代,更通过多项核心技术...

Android 开发中文引导-动画和图形概述

安卓系统提供了各种强大的API,用来将动画应用于界面元素和自定义2D和3D图形的绘制当中。下面的小节大概的描述了可用的API和系统功能并帮助你决定那个方案最适合你的需要。动画安卓框架提供了两种动画系统...

Qt5 C++入门教程-第12章 绘图(QPainter)

QPainter类在Qt5中进行绘图时起着重要作用。绘图操作是通过QPainter类在响应paintEvent方法时完成的。线条在第一个示例中,我们在窗口的客户区绘制了一些线条。line...

文创测评︱《如意琳琅图籍》:本土原创解谜书的胜利?

设想这样一个场景,你打开一本书,就化身为乾隆三十六年紫禁城中的画画人周本,有一天你在故纸堆中找到一本神秘的《如意琳琅图籍》,踏上寻宝旅程,历经各种离奇复杂的故事……这是故宫与奥秘之家联手打造的创意解谜...

gif动图制作攻略!快快收藏(求gif制作的动图)

有事没事斗图玩是当下人们乐此不疲的事情,手里的gif动图也渐渐成为了人们抬杠互怼的一大资本。好有趣,好炫酷,gif是怎么做出来的?我也想做。什么?你不会?没关系,我来教你!首先介绍一下制作gif动图需...

eduis未能初始化界面 无法启动 问题解决办法

1.如果edius安装后启动后出现failedtoinitializeskin中文提示无法初始化界面的错误。这说明你的电脑安装了双显卡,而edius所使用的是图形显卡。可以选择edius图标右键...

写真一周:水岛美结水着解禁、长滨祢瑠婚纱写真等

...

Flash Player模拟器更新:Rufffle(flash模拟器安卓下载高版本)

Ruffle是一个适用于WindowsPC的FlashPlayer模拟器,用Rust编写。Ruffle作为一个独立的应用程序在所有现代操作系统上原生运行,并通过使用WebAssembly在所有现代...

支持终身免费4G流量,星星充电7kW星际智能交流充电桩拆解

前言近期星星充电推出了一款星际智能交流充电桩,在正面设有灯条,可根据灯条颜色和显示直观了解充电状态,并设有屏幕显示充电状态和ui表情。充电桩支持220V/7kW充电功率,适配主流新能源车型。并支持终身...

乐动随心之fancy pop(乐动随心壶多少钱一个)

跳动飞扬的音符像是连通人与人之间心电感应的通关密码,融化陌生,拉近彼此。此次我们邀请到宅男女神江语晨,化身音乐精灵。在歌手、演员身份间游刃自如的她,为我们生动诠释了三种不同的音乐时尚风格,娴静可爱,灵...

Asus Zenflash 手机也能玩引闪,从此相机是路人

在讲解Zenflash之前,不得不提索爱的K750c,这个机器采用了氙气闪光灯,让手机的拍摄上了档次,可玩性更高,不过,说实话,当时手机的摄像头像素低,成像一般,没有掀起太大的波澜,可现在,手机的Cm...

Axure有哪些鲜为人知的使用技巧?(axure的使用教程)

阿拓带你飞:不管是想入门产品经理还是已经是PM的人对AXURE都很关注,它是制作产品原型的重要工具,但是有多少人了解AXURE的使用技巧?本文是来自“知乎问答”整理的回答,一起来看看那些不常用的使用技...

挑战黑夜 华硕ZenFlash氙气闪光灯评测

【机锋配件】说到摄影,相信许多朋友都非常喜欢,不管是外出游玩拍拍风景,还是和朋友之间聚会,都会掏出手机拍两张,在餐前拍照晒朋友圈更是成为了许多用户的日常爱好,就算不是专业的摄影爱好者,大家也都有一颗热...

WPS 演示倒计时 3 步设置!从数字动画到进度条全场景教程

做PPT时想添加倒计时却找不到入口?WPS演示自带的"动画+计时"功能就能轻松实现——无论是课堂互动的30秒答题倒计时、商务汇报的5分钟限时讲解,还是活动暖场的动...

flash动画an制作MG动画元素如何调节透明度,小白...

如何在flash动画软件里面调节mg动画元素的透明?因为flash动画软件现在已经升级为flash动画软件,所以直接用新版flash动画软件开工,基本功能都差不多,只是flash增加很多智能化、人性...