OpenCV EigenFaceRecognizer 人脸识别

news2024/11/28 16:27:57

目录

一、人脸检测vs人脸识别

二、数据库

三、准备需要识别的人脸

四、人脸识别(OpenCV)


一、人脸检测vs人脸识别

人脸检测只是需要检测图像中是否有人脸,而人脸识别是一个程序能够识别出给定图像或者视频中的人脸

二、数据库

人脸数据库,这个博客有网盘链接。

三、准备需要识别的人脸

准备一个人的10张左右数量的人脸,放到刚刚下载ORL的数据库中:

 

捕获人脸代码:

#include <iostream>
#include <opencv2/opencv.hpp>
#include <unistd.h>
#include <sys/stat.h>
#include <sys/types.h>
#include <dirent.h>

using namespace std;
using namespace cv;

void detectFace(Mat frame, string path)
{
    // 级联分类器加载文件
    CascadeClassifier facefier;
    facefier.load("/home/jason/file/opencv/haarcascade_frontalface_alt.xml");

    VideoCapture capture(0);
    vector<Rect> faces;
    Mat gray_frame;

    int number=0;
    while (1)
    {
        capture >> frame;
        imshow("detect face", frame);
        cvtColor(frame,gray_frame,COLOR_BGR2GRAY);
        equalizeHist(gray_frame,gray_frame);

        // 检测人脸
        facefier.detectMultiScale(gray_frame, faces);

        // 保存人脸
        for (size_t i=0; i < faces.size(); i++)
        {

            // 画框标出人脸
            Mat temp = frame.clone();
            rectangle(temp,faces[i], Scalar(255, 0,0), 1, 8);
            imshow("detect face", temp);

            // 扣出人脸
            Mat faceROI = frame(faces[i]);

            // 过滤
            if (faceROI.cols * faceROI.rows > 100 * 100)
            {
                resize(faceROI, faceROI, Size(92, 112));
                string newpath = path + "/" + to_string(number) + ".png";
                imwrite(newpath,faceROI);
                cout << "file  save :" << newpath << endl;
                imshow("ROI", faceROI);
                number++;
            }

        }

        if(waitKey() == 27)
            break;

    }
    cout << "you save " << number << " face images" << endl;


}

void generator(string path)
{

    // 输入文件夹名字
    string name;
    cout << "Please key the name:\n";
    getline(cin, name);


    // 新建文件夹
    string newpath = path + "/" + name;
    cout << "image will save the path:" << newpath.c_str() << endl;

    if (!newpath.empty())
    {
        if(NULL != opendir(newpath.c_str()))
        {
            cout << "fin a dir same to your input! delete it now!" << endl;
            rmdir(newpath.c_str());
        }

        if (NULL == opendir(newpath.c_str()))
        {
            mkdir(newpath.c_str(),0777);
        }

    }

    // 检测人脸并扣出来保存到指定位置
    Mat frame;
    detectFace(frame, newpath);

}




int main()
{
    string path = "/home/jason/file";
    generator(path);
    cout << "Hello World!" << endl;
    return 0;
}

四、人脸识别(OpenCV)

 

实现代码:

#include <iostream>
#include <string>
#include <vector>
#include <algorithm>
#include <dirent.h>
#include <sys/stat.h>

#include <opencv2/opencv.hpp>
#include <opencv2/face/facerec.hpp>
using namespace cv;
using namespace std;

int label=0;
std::string nam;

vector<Mat> images;
vector<int> labels;
vector<string> names;
void Load_data(const std::string& path)
{

    DIR* dir = opendir(path.c_str());
    if (dir == nullptr)
    {
        std::cerr << "Cannot open directory: " << path << std::endl;
        return;
    }

    struct dirent* entry;
    while ((entry = readdir(dir)) != nullptr)
    {
        std::string name = entry->d_name;
        if (name == "." || name == "..")
        {
            continue;
        }

        std::string fullPath = path + "/" + name;
        struct stat stat_buf;
        if (stat(fullPath.c_str(), &stat_buf) != 0)
        {
            std::cerr << "Cannot stat file: " << fullPath << std::endl;
            return;
        }
        // Determine whether it is a folder
        if (S_ISDIR(stat_buf.st_mode))
        {
            std::cout << "Directory: " << fullPath  <<std::endl;
            Load_data(fullPath);


            // label name
            label+=1;
            nam=name;
        }
        else if (S_ISREG(stat_buf.st_mode))
        {
            std::cout << "File: " << fullPath
                      << "  name:" << nam
                      << "  label: "<<label<<std::endl;

            // 添加到容器中
            Mat img = imread(fullPath);

            images.push_back(img);
            labels.push_back(label);
            names.push_back(nam);
        }
    }
    closedir(dir);

}

void FaceRec(const string &path, string person_name="jack")
{
    // 准备数据
    Load_data(path);

    // 训练
//    Ptr<cv::face::FaceRecognizer> model = cv::face::FisherFaceRecognizer::create();
    Ptr<cv::face::EigenFaceRecognizer> model = cv::face::EigenFaceRecognizer::create();
//    Ptr<cv::face::LBPHFaceRecognizer> model = cv::face::LBPHFaceRecognizer(1, 8,8,8,);
    model->train(images, labels);

    // 创建一个级联分类器 加载一个 .xml 分类器文件. 它既可以是Haar特征也可以是LBP特征的分类器.
    CascadeClassifier casc;
    casc.load("/home/jason/file/opencv/haarcascade_frontalface_alt.xml");

    int jack_label;

    for (size_t i=0; i<names.size(); i++)
    {
        if (names[i] == person_name)
            jack_label=labels[i];
    }

    VideoCapture capture(0);
    Mat frame, gray;
    vector<Rect> faces;

    while (1)
    {
        // 获取图像
        capture >> frame;

        imshow("recognizer", frame);

        // 预处理
        cvtColor(frame,gray,COLOR_RGB2GRAY);
        equalizeHist(gray, gray);

        // 检测人脸
        casc.detectMultiScale(gray, faces);

        // 扣出人脸判断是否为目标人物
        for(size_t i=0; i<faces.size(); i++)
        {
            Mat temp = frame.clone();
            rectangle(temp, faces[i], Scalar(255, 0, 0), 1, 8);

            Mat roi_gray = gray(faces[i]);
            resize(roi_gray, roi_gray, Size(92, 112));
            imshow("person",roi_gray);

            int result;
            double confidence=0.8;

            // 预测
            model->predict(roi_gray, result, confidence);
            cout<< "result: " << result
                <<"confidence: " << confidence<< endl;
            if (result==jack_label)
            {
                putText(temp, person_name ,Point(faces[i].x, faces[i].y),FONT_ITALIC,
                        0.5, Scalar(255, 0, 0),1,8);
            }
            else
            {
                cout << "not  find " << person_name << endl;

            }
            imshow("recognizer", temp);
        }

        if (waitKey(10)==27) break;

    }
}



int main()
{
    std::string path = "/home/jason/file/Face/ORL_Faces";
    FaceRec(path,"jack");
    return 1;
}

参考资料:

C++创建文件夹和写文件_林多的博客-CSDN博客

C++11标准中遍历文件夹方法_c++11 遍历目录_HotPot_Dumplings的博客-CSDN博客

OpenCV: cv::face::FaceRecognizer Class Reference

https://www.cnblogs.com/zyly/p/9498857.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/470773.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

大数据之Hadoop分布式数据仓库HBase

目录&#xff1a; 一、Hadoop的局限二、HBase简介三、HBase Table四、数据的读写流程简述五、HBase Java API 1.0 的基本使用六、HBase Java API 2.0 的基本使用七、正确连接Hbase八、Hbase 常用 Shell 命令九、Hbase容灾与备份十、引入Phoenix core JAR包&#xff08;HBase中间…

好用免费的电脑摄像头录视频软件分享!

案例&#xff1a;如何录制电脑的摄像头&#xff1f; 【这周我需要开一个视频会议&#xff0c;会议十分重要&#xff0c;我希望把它录制下来。有没有小伙伴知道&#xff0c;电脑摄像头如何录制&#xff1f;求一个可以快速上手的方法&#xff01;】 在现如今的数字化时代&#…

计算机网络学习03(OSI、TCP/IP网络分层模型详解))

1、OSI 七层模型 OSI 七层模型 是国际标准化组织提出一个网络分层模型&#xff0c;其大体结构以及每一层提供的功能如下图所示&#xff1a; 每一层都专注做一件事情&#xff0c;并且每一层都需要使用下一层提供的功能比如传输层需要使用网络层提供的路由和寻址功能&#xff0…

【小程序】图文教程:完整说明如何把小程序代码提交到gitee上

目录 建项目本地打开配置远程分支发布到远程分支检验后续提交 建项目 注*&#xff1a;会在gitee上建项目的可以略过 进入到gitee官网&#xff0c;点击右侧的&#xff0c;创建新项目 进入到该页面&#xff1a; 填好之后&#xff0c;点击创建 进入下面页面&#xff0c;点击初…

用GPT 从0搭建 Jest 到帮写测试用例

本文作者为 360 数据平台部前端开发工程师 为什么要用AI写单测 这个问题分两点来说&#xff0c;第一是为什么要写单测&#xff0c;第二是为什么要用AI。 先来说为什么写单测&#xff0c;这很简单&#xff0c;我们项目或者说我们前端团队有公共模块&#xff0c;包含有组件类型、…

ipv6地址技术详解

一、什么是IPv6&#xff1f; IPv6是英文“Internet Protocol Version 6”&#xff08;互联网协议第6版&#xff09;的缩写&#xff0c;是互联网工程任务组&#xff08;IETF&#xff09;设计的用于替代IPv4的下一代IP协议&#xff0c;其地址数量号称可以为全世界的每一粒沙子编…

你可能需要的IDEA-Java开发插件

Idea开发插件 Alibaba Cloud AI Coding Assistant 阿里云智能编码插件&#xff08;Alibaba Cloud AI Coding Assistant&#xff09;是一款AI编程助手&#xff0c;它提供代码智能补全和代码示例搜索能力&#xff0c;帮助你更快更高效地写出高质量代码。 让我觉得比较有意思的…

Docker安装在Linux系统上(纯步骤)

Docker安装在Linux系统上操作步骤 本文章只有操作步骤&#xff0c;没有原理解释&#xff0c;只是用来提醒自己安装步骤 下面是docker官网&#xff0c;也有安装详情 https://docs.docker.com/engine/install/centos/ 安装分为四步走 我使用的是CentOS7版本&#xff0c;下面命令…

Linux基本权限

文章目录 前言一、Shell命令以及运行原理1.Shell的定义2.为什么用户不能直接使用kernel&#xff1f; 二、Linux中的权限1.权限是什么&#xff1f;2.如何操作权限呢&#xff1f;&#xff08;怎么修改权限&#xff09;1. 修改文件属性2. 修改文件角色 3.为什么要有权限 三、粘滞位…

直接插入排序(Straight Insertion Sort)

本文已收录于专栏 《算法合集》 一、简单释义 1、算法概念 对插入第i个记录时&#xff0c;R1、R2、…、Ri-1均已排好顺序。因此&#xff0c;将第i个记录Ri-1、…、R2、R1进行比较&#xff0c;找到合适的位置插入&#xff0c;他简单明了但是速度很慢。 2、算法目的 把无序数组通…

windows下免费本地部署类ChatGpt的国产ChatGLM-6B

ChatGLM-6B 是一个开源的、支持中英双语的对话语言模型&#xff0c;基于 General Language Model (GLM) 架构&#xff0c;具有 62 亿参数。结合模型量化技术&#xff0c;用户可以在消费级的显卡上进行本地部署&#xff08;INT4 量化级别下最低只需 6GB 显存&#xff09;。 Chat…

禁止右键禁止复制禁止选择网页内容的CSS和JS代码(支持PC和移动端)

禁止右键禁止复制禁止选择网页内容的CSS和JS代码&#xff08;支持PC和移动端&#xff09;&#xff0c;收藏吧&#xff0c;用得上。 body {-moz-user-select: none;/* Firefox私有属性 */-webkit-user-select: none;/* WebKit内核私有属性 */-ms-user-select: none;/* IE私有属…

项目1登录功能优化(中间件添加操作信息,统一日志输出)

中间件添加操作信息 context增加属性userid用于储存访问者id,便于后期使用中间件添加操作信息 type Context struct { //......,context其他属性 Userid int} 对于添加操作信息的中间件函数 // 添加用户操作中间件func Addoperationmid(db *sql.DB) gee7.HandlerFunc { retu…

SpringBoot【运维实用篇】---- 多环境开发

SpringBoot【运维实用篇】---- 多环境开发 1. 多环境开发&#xff08;yaml单一文件版&#xff09;2. 多环境开发&#xff08;yaml多文件版&#xff09;3. 多环境开发&#xff08;properties多文件版&#xff09;4. 多环境开发独立配置文件书写技巧5. 多环境开发控制 讲的内容距…

【LeetCode】1000题挑战(220/1000)

1000题挑战 没有废话&#xff0c;直接开刷&#xff01; 目录 1000题挑战 没有废话&#xff0c;直接开刷&#xff01; 第一题&#xff1a;119. 杨辉三角 II - 力扣&#xff08;Leetcode&#xff09; 题目接口 解题思路 代码&#xff1a; 过过过过啦&#xff01;&#x…

【Python】【进阶篇】13、Django安装与配置教程

目录 Django安装与配置教程1. Windows系统安装Django1) 离线安装2) 在线安装3) 配置Django环境变量4) 检查是否安装成功 2. Linux和Mac系统安装Django1) 使用终端在线安装2) 下载安装包离线安装 Django安装与配置教程 本节主要对 Django 在各个平台上的安装方式与配置进行讲解…

Blender 插件UvSquares

目录 1. UvSquares插件1.1 解压UvSquares插件1.2 blender偏好设置1.3 打开插件1.4 安装插件1.5 勾选插件UvSquares1.6 安装UvSquares插件前1.7 安装UvSquares插件后 1. UvSquares插件 Blender 的 UV 编辑器工具&#xff0c;可将 UV 选择重塑为网格。 下载&#xff1a;https:/…

关于jsonp的理解。利用 百度“联想搜索”接口

什么是 回调函数&#xff1f; 在 JavaScript 中&#xff0c;回调函数是指将一个函数作为参数传递给另一个函数&#xff0c;以在某些操作完成后通知调用者。当操作完成时&#xff0c;被调用的函数&#xff08;即回调函数&#xff09;将被调用&#xff0c;以执行某些指定的操作或…

Ajax的简单使用

目录 1、ajax概述 2、模拟ajax 3、Jquery实现ajax &#xff08;1&#xff09;通用开发步骤 &#xff08;2&#xff09;示例 注册用户名重复性验证 &#xff08;3&#xff09;示例 ajax解析json数据 &#xff08;4&#xff09;实现细节 4、axios实现ajax 5、ajax发送PUT…

西门子安装和配置

一、已安装 V16&#xff0c;检查软件正常 1.判断西门子软件是否正常工作&#xff0c;检查软件图标&#xff0c;如下图。 2.如果软件图标不存在&#xff0c;检查Windows服务是否存在&#xff0c;打开方法如下图&#xff1a; 3.检查西门子的服务&#xff0c;共16个服务&#xff…