opencv 人脸识别 (二)训练和识别

2023-10-29

上一篇中我们对训练数据做了一些预处理,检测出人脸并保存在\pic\color\x文件夹下(x=1,2,3,...类别号),本文做训练和识别。为了识别,首先将人脸训练数据 转为灰度、对齐、归一化,再放入分类器(EigenFaceRecognizer),最后用训练出的model进行predict。


-----------------------------------------


环境:vs2010+opencv 2.4.6.0

特征:eigenface

Input:一个人脸数据库,15个人,每人20个样本(左右)。

Output:人脸检测,并识别出每张检测到的人脸。


-----------------------------------------


1. 为训练数据预处理( 转为灰度、对齐、归一化 )

  • 转为灰度和对齐是后面做训练时EigenFaceRecognizer的要求;
  • 归一化是防止光照带来的影响

在上一篇的 2.2 Prehelper.cpp文件中加入函数

void resizeandtogray(char* dir,int k,  vector<Mat> &images, vector<int> &labels,
vector<Mat> &testimages, vector<int> &testlabels);


[cpp]  view plain  copy   在CODE上查看代码片 派生到我的代码片
  1. void resizeandtogray(char* dir,int K, vector<Mat> &images, vector<int> &labels,  
  2.     vector<Mat> &testimages, vector<int> &testlabels)  
  3. {  
  4.     IplImage* standard = cvLoadImage("D:\\privacy\\picture\\photo\\2.jpg",CV_LOAD_IMAGE_GRAYSCALE);  
  5.     string cur_dir;  
  6.     char id[5];  
  7.     int i,j;  
  8.     for(int i=1; i<=K; i++)  
  9.     {  
  10.         cur_dir = dir;  
  11.         cur_dir.append("gray\\");     
  12.         _itoa(i,id,10);  
  13.         cur_dir.append(id);  
  14.         const char* dd = cur_dir.c_str();  
  15.         CStatDir statdir;  
  16.         if (!statdir.SetInitDir(dd))  
  17.         {  
  18.             puts("Dir not exist");  
  19.             return;  
  20.         }  
  21.         cout<<"Processing samples in Class "<<i<<endl;  
  22.         vector<char*>file_vec = statdir.BeginBrowseFilenames("*.*");  
  23.         for (j=0;j<file_vec.size();j++)  
  24.         {  
  25.             IplImage* cur_img = cvLoadImage(file_vec[j],CV_LOAD_IMAGE_GRAYSCALE);  
  26.             cvResize(cur_img,standard,CV_INTER_AREA);  
  27.             Mat cur_mat = cvarrToMat(standard,true),des_mat;  
  28.             cv::normalize(cur_mat,des_mat,0, 255, NORM_MINMAX, CV_8UC1);  
  29.             cvSaveImage(file_vec[j],cvCloneImage(&(IplImage) des_mat));  
  30.             if(j!=file_vec.size())  
  31.             {  
  32.                     images.push_back(des_mat);  
  33.                     labels.push_back(i);  
  34.             }  
  35.             else  
  36.             {  
  37.                 testimages.push_back(des_mat);  
  38.                 testlabels.push_back(i);  
  39.             }  
  40.         }  
  41.         cout<<file_vec.size()<<" images."<<endl;  
  42.     }  
  43. }  



并在main中调用:

[cpp]  view plain  copy   在CODE上查看代码片 派生到我的代码片
  1. int main( )  
  2. {  
  3.     CvCapture* capture = 0;  
  4.     Mat frame, frameCopy, image;  
  5.     string inputName;     
  6.     int mode;  
  7.   
  8.     char dir[256] = "D:\\Courses\\CV\\Face_recognition\\pic\\";   
  9.     //preprocess_trainingdata(dir,K); //face_detection and extract to file  
  10.     vector<Mat> images,testimages;  
  11.     vector<int> labels,testlabels;  
  12.     resizeandtogray(dir,K,images,labels,testimages,testlabels); //togray, normalize and resize  
  13.       
  14.     system("pause");  
  15.     return 0;  
  16. }  




2. 训练

有了vector<Mat> images,testimages; vector<int> labels,testlabels; 可以开始训练了,我们采用EigenFaceRecognizer建模。

在Prehelper.cpp中加入函数

Ptr<FaceRecognizer> Recognition(vector<Mat> images, vector<int> labels,vector<Mat> testimages, vector<int> testlabels);


[cpp]  view plain  copy   在CODE上查看代码片 派生到我的代码片
  1. Ptr<FaceRecognizer> Recognition(vector<Mat> images, vector<int> labels,  
  2.     vector<Mat> testimages, vector<int> testlabels)  
  3. {  
  4.     Ptr<FaceRecognizer> model = createEigenFaceRecognizer(10);//10 Principal components  
  5.     cout<<"train"<<endl;  
  6.     model->train(images,labels);  
  7.     int i,acc=0,predict_l;  
  8.     for (i=0;i<testimages.size();i++)  
  9.     {  
  10.         predict_l = model->predict(testimages[i]);  
  11.         if(predict_l != testlabels[i])  
  12.         {  
  13.             cout<<"An error in recognition: sample "<<i+1<<", predict "<<  
  14.                 predict_l<<", groundtruth "<<testlabels[i]<<endl;  
  15.             imshow("error 1",testimages[i]);  
  16.             waitKey();  
  17.         }  
  18.         else  
  19.             acc++;  
  20.     }  
  21.     cout<<"Recognition Rate: "<<acc*1.0/testimages.size()<<endl;  
  22.     return model;  
  23. }  



Recognization()输出分错的样本和正确率,最后返回建模结果Ptr<FaceRecognizer> model


主函数改为:

[cpp]  view plain  copy   在CODE上查看代码片 派生到我的代码片
  1. int main( )  
  2. {  
  3.     CvCapture* capture = 0;  
  4.     Mat frame, frameCopy, image;  
  5.     string inputName;     
  6.     int mode;  
  7.   
  8.     char dir[256] = "D:\\Courses\\CV\\Face_recognition\\pic\\";   
  9.     //preprocess_trainingdata(dir,K); //face_detection and extract to file  
  10.     vector<Mat> images,testimages;  
  11.     vector<int> labels,testlabels;  
  12.     //togray, normalize and resize; load to images,labels,testimages,testlabels  
  13.     resizeandtogray(dir,K,images,labels,testimages,testlabels);   
  14.     //recognition  
  15.     Ptr<FaceRecognizer> model = Recognition(images,labels,testimages,testlabels);  
  16.     char* dirmodel = new char [256];  
  17.     strcpy(dirmodel,dir); strcat(dirmodel,"model.out");  
  18.     FILE* f = fopen(dirmodel,"w");  
  19.     fwrite(model,sizeof(model),1,f);  
  20.     system("pause");  
  21.     return 0;  
  22. }  



最终结果:一个错分样本,正确率93.3%





文章所用代码打包链接:http://download.csdn.net/detail/abcjennifer/7047853




FROM:  http://blog.csdn.net/abcjennifer/article/details/20446077

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

opencv 人脸识别 (二)训练和识别 的相关文章

  • win10电脑如何取得管理员权限

    系统获取最高管理员权限步骤 1 在系统桌面点击右键 新建 文本文档 2 打开文本文档 将一下代码复制进去 Windows Registry Editor Version 5 00 HKEY CLASSES ROOT shell runas
  • C#流程控制————分支结构

    1 顺序结构 顺序结构 程序从Main函数进入 从上到下一行一行的执行 不会落下任何一行 2 分支结构 if 分支结构 if 1 if语句 if 判断条件 要执行的代码 判断条件 一般为关系表达式或者bool类型的值 执行过程 程序运行到i
  • 唤醒java记忆

    1 接口
  • Python-PyQt5-图形可视化界面(3)--按钮--Qpushbutton

    Python PyQt5 图形可视化界面 3 按钮 Qpushbutton 转载自 Python PyQt5 图形可视化界面 3 按钮 Qpushbutton 简书 https www jianshu com p a3f29d3bb234
  • 如何提高英文的科研写作能力-施一公

    转自 http blog sciencenet cn home php mod space uid 46212 do blog id 349932 作为一个科研工作者 在国际学术期刊上发表科研论文是与同行交流 取得国际影响的必经之路 有些国
  • 第十章:C语言的调试

    很多小伙伴刚开始听到C语言的调试 这是个啥 表示很怀疑 敲代码不就是直接就是干嘛 结果很多小白们 一运行错误多的数都数不过来 就开始这改改 那删删 莫名奇妙就运行成功了 到最后都不知道到底那错了 有一种小朋友是否有多问号的感觉 可想而知代码
  • AndroidStudio历史记录找回本地修改代码

    今天干了一件特别无语的事情 在现有项目中将新需求开发的代码包想挪一下位置 结果在AndroidStudio中移动失败了 并且原有的包下所有代码都找不到了 搜索了整个项目都没有找到相应的java文件 瞬间心慌啊 这意味着该包下的代码白写了 想
  • npm install报错 -> npm ERR! Unexpected token ‘.‘ 报错解决办法

    原因 我遇到这个问题的场景是用nvm1 1 7的版本安装了16 x以上的node 然后再下载依赖的时候就报错了 总结一下就是nvm版本太低了 他的里面没有集成高版本node导致的 解决 我们把nvm版本换到最新的就可以了 1 卸载掉当前所有
  • 第4章 R语言编程基础——数据整理与预处理

    目录 4 1 经济 金融数据库 4 1 1 金融数据与数据库 4 1 2 国外金融数据库概况 4 1 3 国内金融数据库概况 4 1 4 数据的主要内容 4 2 数据格式 4 3 数据的导入 4 3 1 从控制台上输入数据 4 3 2 上市
  • 异步模式之生产者与消费者

    1 定义 异步 由于存在消息队列 生产者产生的数据不能立刻被消费者处理 中间会有延迟 因此归为异步 异步与同步的区别 同步 线程A要请求某个资源 但是此资源正在被线程B使用中 因为同步机制存在 线程A请求不到 只能等待下去 异步 线程A要请
  • 存储过程违反GTID一致性的问题解决方法

    java sql SQLException Statement violates GTID consistency CREATE TEMPORARY TABLE 解决 2021 2 1项目现场反馈存储过程程序报错无法创建和删除临时表 语句违
  • io.netty.channel.AbstractChannel$AnnotatedConnectException: Connection refused: no further informati

    项目启动报错 io netty channel AbstractChannel AnnotatedConnectException Connection refused no further information 127 0 0 1 63
  • Linux访问ioctl访问失败的问题

    今天遇到一个ioctl访问失败的问题 做个记录 主要是用户态是32位 内核态时64位的 对于字符设备 内核中ioctl的挂接有不同 一 写64位driver驱动时 必须实现compat ioctl实现 用户态是32位时 会调用这个接口 否则
  • SpringBoot使用多线程

    一 概述 1 为什么使用多线程 在我们开发系统过程中 经常会处理一些好费时间的任务 如 向数据库中插入上百万数据 将会导致系统等待 这个时候就会自然想到使用多线程 2 为什么使用Spring来实现多线程 使用Spring比使用JDK原生的并
  • 企业人员信息管理(一)

    一 struts2和hibernate整合 1 整合 StrutsPrepareAndExecuteFilter作用详解 https blog csdn net clk esunny article details 80293978 过滤器

随机推荐

  • 跨境外贸业务,选择动态IP还是静态IP?

    在跨境业务中 代理IP是一个关键工具 它们提供了匿名的盾牌 有助于克服网络服务器针对数据提取设置的限制 无论你是需要经营管理跨境电商店铺 社交平台广告投放 还是独立站SEO优化 代理IP都可以让你的业务程度更加丝滑 达到事半功倍的效果 代理
  • python是不是面向对象的程序设计语言是_Python是一种面向对象程序设计语言

    Python是一种面向对象程序设计语言 答 正确 中国大学MOOC 构建人类命运共同体 要求在政治上 答 相互尊重 平等协商 成人膀胱空虚时膀胱尖不超过 答 耻骨联合上缘 课堂教学中常采用 读一读 议一议 练一练 讲一讲 的教学方式 这符合
  • 百度文心一言可以接入微信小程序啦!

    文心一言 英文名 ERNIE Bot 是百度全新一代知识增强大语言模型 文心大模型家族的新成员 能够与人对话互动 回答问题 协助创作 高效便捷地帮助人们获取信息 知识和灵感 接入小程序效果图 1 百度智能云 千帆大模型平台 注册登录账号 2
  • Qt Creator增强套装16.9.27.12更新

    HI 大家好 这里是jiangcaiyang 我们很高兴地告诉大家 我们将要发布Qt Creator增强套装新的版本了 这一次呢 主要是应大家强烈的要求 更新了我们的聊天神器 萌梦聊天室 现在它不再频繁地崩溃以及暂时性地无法回消息了 这个聊
  • docker安装seata

    下载seata docker镜像 docker pull seataio seata server 1 4 2 创建挂载目录和文件 mkdir p opt docker seata conf touch opt docker seata c
  • 创建老版本react-native项目,以0.59.10为例(0.60.0之前的版本)

    目录 创建react native 0 59 10版本项目前言 开始创建react native 0 59 10版本 创建react native 0 59 10版本项目前言 写这篇文章之前 有些东西要说明一下 当前rn的最新版本为 0 7
  • JavaFx转换为exe

    要点 首先导入依赖 在pom xml导入依赖 具体解释 而maven的两种方式 前者生成两个文件 程序jar包与复制所需的依赖jar包到lib目录 操作比较繁琐 而且在exe4j中进行打包的话会出现Caused by java lang N
  • JS基础知识(二十八):箭头函数

    1 箭头函数的使用 箭头函数有两种格式 一种只包含一个表达式 没有 和 return 一种包含多条语句 这个时候 return 就不能省略 箭头函数类型 代码 没有参数 gt 100 function return 10 一个参数 x gt
  • 使用Initramfs挂载根文件系统,编译过程multiple target patterns(多个目标匹配)问题的解决

    编译内核前 配置内核用Initramfs挂载根文件系统 配置选项如下 Genera setup gt Initial RAM filesystem and RAM disk initramfs initrd support home myr
  • 想要精通算法和SQL的成长之路 - 戳气球

    想要精通算法和SQL的成长之路 戳气球 前言 一 戳气球 1 1 记忆化搜索 前言 想要精通算法和SQL的成长之路 系列导航 一 戳气球 原题链接 首先我们看一下题干 对于超出了数组边界的 就当做它是一个数字为1的气球 遇到这种的 我们可以
  • POI设置EXCEL单元格的"条件格式"

    这篇博客主要是说明如何通过POI设置excle文档中单元格的条件格式 POI版本 poi 3 5 FINAL 涉及到的主要类 org apache poi hssf usermodel HSSFSheet org apache poi hs
  • SAN 网络配置规范

    管理网络的界定 为了统一起见 我们对管理网络进行如下界定 1 管理网络是指专门开辟一个用于管理的网络 主要用于 SAN 网 络设备的管理和调试 SAN 存储设备的管理和调试等 包括 BNA SAN 网络管理系统均使用管理网络 地址段为 X
  • Error when import grpc: "Symbol not found: _deflate"解决方法

    Import grpc时出现如下错误 Traceback most recent call last File private var tmp bazel lls 5ea0bb16383fa9c06c47b535a23ac475 execr
  • mybatis—plus

    接口和实现类都继承 如果你让你的服务接口继承 IService 并让你的服务实现类继承 ServiceImpl 那么你的服务接口将明确地列出所有可用的 CRUD 方法 只继承 ServiceImpl 如果你只让你的服务实现类继承 Servi
  • 【改进算法】【IHAOAVOA】天鹰优化算法和非洲秃鹫混合优化算法

    目录 1 主要内容 2 部分代码 3 程序结果 4 下载链接 1 主要内容 该程序复现 IHAOAVOA An improved hybrid aquila optimizer and African vultures optimizati
  • 深入理解Java并发之synchronized实现原理

    线程安全是并发编程中的重要关注点 应该注意到的是 造成线程安全问题的主要诱因有两点 一是存在共享数据 也称临界资源 二是存在多条线程共同操作共享数据 因此为了解决这个问题 我们可能需要这样一个方案 当存在多个线程操作共享数据时 需要保证同一
  • 【运维知识进阶篇】Ansible实现一套完整LNMP架构

    前面介绍了PlayBook怎么写服务部署 把服务部署上后 我们来用Ansible来部署项目 实现一套完整的LNMP架构 我们部署wordpress wecenter phpshe phpmyadmin这四个项目 将其所有的剧本都写入lnmp
  • python第二阶段(14)numpy入门基础-可视化之折线图

    numpy入门基础 可视化之折线图 1 numpy的折线图plot date函数 2 示例 1 简单的示例 2 股票时间序列图 演示 1 numpy的折线图plot date函数 折线图 折线图是用直线段将各数据连接起来组成的图形 常用来观
  • 【自我解析】2020华为杯数学建模比赛C题

    C题相较于A题专业性不是那么强 更偏向对给出数据的处理 这里我看了三篇优秀论文进行此题的学习 分别为0319 同济 0034 上海理工 0095 上海交通 题目提供两个数据附件 P300的介绍 睡眠过程 问题一 0319对于问题一的分析 0
  • opencv 人脸识别 (二)训练和识别

    上一篇中我们对训练数据做了一些预处理 检测出人脸并保存在 pic color x文件夹下 x 1 2 3 类别号 本文做训练和识别 为了识别 首先将人脸训练数据 转为灰度 对齐 归一化 再放入分类器 EigenFaceRecognizer