c++_opencv的人脸识别起步三训练自己的模型

article/2025/5/7 9:56:44

目录

    • 1、Creating the CSV File
    • 2、读取CSV文件函数
    • 3、开始训练模型
    • 4、程序

1、Creating the CSV File

照片需要在程序中读取它,我决定使用CSV文件读取它。一个CSV文件包含文件名,紧跟一个标签。
/path/to/image.ext;0假设/path/to/image.ext是图像,就像你在windows下的c:/faces/person0/image0.jpg。最后我们给它一个标签0。这个标签类似代表这个照片的名字,所以同一张的照片的标签都一样。
打开DOS命令即打开命令控制台,进入相对路径下去,然后进入储存照片的路径下去输入f:\opencv_example\pic>dir /b/s *.jpg >at.txt
即可生成at.txt文件在这里插入图片描述

2、读取CSV文件函数

void read_csv(const string& filename, vector<Mat>& images, vector<int>& labels, char separator = ';')
{       std::ifstream file(filename.c_str(), ifstream::in);//c_str()函数可用可不用,无需返回一个标准C类型的字符串if (!file){string error_message = "No valid input file was given, please check the given filename.";CV_Error(CV_StsBadArg, error_message);}string line, path, classlabel;while (getline(file, line))//从文本文件中读取一行字符,未指定限定符默认限定符为“/n”{stringstream liness(line);//这里采用stringstream主要作用是做字符串的分割getline(liness, path, separator);//读入图片文件路径以分好作为限定符getline(liness, classlabel);//读入图片标签,默认限定符if (!path.empty() && !classlabel.empty())//如果读取成功,则将图片和对应标签压入对应容器中 {images.push_back(imread(path, 0));labels.push_back(atoi(classlabel.c_str()));}}
}

3、开始训练模型

(1)创建一个图像容器和标签容器(createEigenFaceRecognizer()函数来创建分类器时是可以人为指定训练结果的维数以及判别阈值,这里我们采用系统默认的参数)来存储训练图像以及对应人脸标签,然后调用void read_csv()填充这两个容器;
(2)然后创建一个PCA人脸分类器,暂时命名为model吧,创建完成后,调用其中的成员函数train()(train()函数的执行时间与训练样本图片数目有关)来完成分类器的训练。
(3)训练得到的分类器model用save()函数保存成XML文件存储下来,下次用的时候直接用laod()加载就行,

#include<iostream>
#include <fstream>
#include <sstream>
#include <opencv2\opencv.hpp>
#include <opencv2\face.hpp>
#include <windows.h>  
#include  <direct.h>  using namespace cv;
using namespace std;
using namespace face;CascadeClassifier face_cascades;
//读取CSV文件函数
void read_csv(const string& filename, vector<Mat>& images, vector<int>& labels, char separator = ';')
{std::ifstream file(filename.c_str(), ifstream::in);//c_str()函数可用可不用,无需返回一个标准C类型的字符串if (!file){string error_message = "No valid input file was given, please check the given filename.";CV_Error(CV_StsBadArg, error_message);}string line, path, classlabel;while (getline(file, line))//从文本文件中读取一行字符,未指定限定符默认限定符为“/n”{stringstream liness(line);//这里采用stringstream主要作用是做字符串的分割getline(liness, path, separator);//读入图片文件路径以分好作为限定符getline(liness, classlabel);//读入图片标签,默认限定符if (!path.empty() && !classlabel.empty())//如果读取成功,则将图片和对应标签压入对应容器中 {images.push_back(imread(path, 0));labels.push_back(atoi(classlabel.c_str()));}}
}int main()
{char   buffer[MAX_PATH];_getcwd(buffer, MAX_PATH);printf("The  buffer  is:   %s ", buffer);string fn_csv;fn_csv = buffer;fn_csv = fn_csv + "F:\\opencv_example\\pic\\at.txt";//string fn_csv = "./pic/at.txt";//读取你的CSV文件路径.  相对路径读取失败linuxvector<Mat> images;// 2个容器来存放图像数据和对应的标签vector<int> labels;read_csv(fn_csv, images, labels);//从csv文件中批量读取训练数据Ptr<FaceRecognizer> model = createEigenFaceRecognizer();model->train(images, labels);model->save("F:\\opencv_example\\pic\\MyFaceRecognizer.xml");//保存路径return 0;
}

4、程序

还可以输出一些与训练集相关的结构,比如训练集的均值特征脸、重构特征脸等
//获得特征值,特征向量,均值 平均脸
Mat eigenvalues = model->getEigenValues();
Mat eigenvectors = model->getEigenVectors();
Mat mean = model->getMean();
Mat meanFace = mean.reshape(1, height);
Mat dst;
dst = normal(meanFace, dst);
imshow(“Mean Face”, dst);

//特征脸
for (int i = 0; i < min(10, eigenvectors.cols); i++)
{Mat ev = eigenvectors.col(i).clone();Mat eigenFace = ev.reshape(1, height);Mat grayscale;grayscale = normal(eigenFace, grayscale);Mat colorface;applyColorMap(grayscale, colorface, COLORMAP_BONE);char* winTitle = new char[128];sprintf(winTitle, "eigenface_%d", i);imshow(winTitle, colorface);
}//重建人脸
for (int num = min(10, eigenvectors.cols); num < min(300, eigenvectors.cols); num += 15)
{Mat evs = Mat(eigenvectors, Range::all(), Range(0, num));Mat projection = LDA::subspaceProject(evs, mean, image[0].reshape(1, 1));Mat reconstruction = LDA::subspaceReconstruct(evs, mean, projection);Mat result = reconstruction.reshape(1, height);reconstruction = normal(result, reconstruction);char* winTitle = new char[128];sprintf(winTitle, "recon_face_%d", num);imshow(winTitle, reconstruction);
}

http://chatgpt.dhexx.cn/article/64Z2a435.shtml

相关文章

201819101001 张佳兴

@[TOC]九九乘法表 累乘 欢迎使用Markdown编辑器 你好! 这是你第一次使用 Markdown编辑器 所展示的欢迎页。如果你想学习如何使用Markdown编辑器, 可以仔细阅读这篇文章,了解一下Markdown的基本语法知识。 新的改变 我们对Markdown编辑器进行了一些功能拓展与语法支持,…

OpenCV(五)——运动目标识别

课程一览: 目录 1.摄像头调用 2.视频的读取与保存 3.帧差法 4.光流法 5.背景减除法

Python-中北大学人工智能OpenCV人脸识别(根据图片训练数据,根据训练好的数据识别人脸)

文章目录 1. 根据训练照片训练数据模型2. 根据训练的数据文件&#xff0c;进行人脸识别 1. 根据训练照片训练数据模型 训练流程&#xff1a; 读取文件夹下的所有文件&#xff0c;使用PIL 库中的Image方法打开图片&#xff0c;并将其转化为灰度图片。加载人脸数据分类器&#x…

李腾飞 java_黑马师资团队之【李腾飞老师】

本帖最后由 火影七代目 于 2017-8-4 16:48 编辑 李腾飞老师在北京传智JavaEE就业254期又一次的创新了数据&#xff0c; 这也体现出来飞哥对学员真心的对待和耐心的授课&#xff0c; 看到下面的话语&#xff0c;也是学员对飞哥的恋恋不舍李腾飞老师在254期评分很高&#xff0c;得…

基于openCV的车牌识别(模板匹配)python版

利用提供的模板进行车牌识别&#xff1a; 模板&#xff1a; 测试数据&#xff1a; 整体思路分为3个步骤&#xff1a;①将图像中车牌位置截取出来&#xff1b;②将车牌安照字符进行分割&#xff1b;③对分割好的字符图像进行模板匹配。实验基于jupyter进行&#xff0c;具体代码…

OpenCV-顶帽运算(TOPHAT)

作者&#xff1a;翟天保Steven 版权声明&#xff1a;著作权归作者所有&#xff0c;商业转载请联系作者获得授权&#xff0c;非商业转载请注明出处 原理 形态学是图像处理中常见的名词&#xff0c;图像处理的形态学基本属于数学形态学的范畴&#xff0c;是一门建立在格论和拓扑…

小白都能学会的python+opencv,带你从人脸识别做到车牌识别,成为别人口中赞叹的高手!

一.第一步&#xff0c;对于小白来说&#xff0c;用什么编辑很难选择&#xff0c;怎么下载免费的编辑器也不会&#xff0c;会用电脑下载的又总是被下载许多附带的垃圾软件&#xff0c;这个问题让我来解决&#xff0c;这里我们首先需要安装两个软件以及配置一个pip豆瓣源&#xf…

基于VS与OpenCV的模板匹配学习(2):边缘匹配+图像金字塔

基于VS与OpenCV的模板匹配学习&#xff08;2&#xff09; 边缘模板匹配图像金字塔 基于C与OpenCV的模板匹配学习&#xff08;1&#xff09;OpenCV matchTemplate()示例 文章目录 基于VS与OpenCV的模板匹配学习&#xff08;2&#xff09;边缘模板匹配图像金字塔前言一、边缘检…

Struts2的基本流程的详细介绍

Struts2的基本流程 10级学员 张帅鹏课堂笔记 概述&#xff1a; Struts2框架由三部分构成&#xff1a;核心控制器、业务控制器和用户实现的业务逻辑组件。在这三部分中&#xff0c;struts2框架提供了核心控制器StrutsPrepareAndExecuteFilter&#xff0c;而用户需要实现业务控…

jQuery插件autoComplete介绍(10级学员 张帅鹏总结)

jQuery插件autoComplete介绍 概述&#xff1a;AutoComplete为自动填充&#xff0c;展示之意。用户在使用文本框搜索信息时&#xff0c;使用插件的autoplete方法绑定文本框。当在文本框中输入某个字符时&#xff0c;通过该方法中的指定的数据URL&#xff0c;返回相匹配的数据&a…

C语言 编写Vector方法

Vector是一个单口进出的数组结构有一点像栈的结构。 首先建立这样一个结构体&#xff0c;里面包含一个数组以及一个位置标记&#xff0c;数组来存放进入的元素&#xff0c;标记指向尾部最后一个没有存放东西的数组位置。当然数组元素可以自定义为任何格式&#xff0c;甚至也可…

多组数据的输入方法(c语言实现)

先说方法之前先来浅聊一下scanf 开始进入正题 1.EOF法 EOF(end of file)就是文件的结束&#xff0c;通常来判断文件的操作是否结束的标志。 EOF不是特殊字符&#xff0c;而是定义在头文件<stdio.h>的常量&#xff0c;等于-1&#xff1b; 就如牛客网上的一道题为例&…

c语言:数组插入处理

规定输入9个元素&#xff0c;排序后&#xff0c;再输入一个数要求按原来排序的规律将它插入数组中。 初始化数组函数&#xff1a; void assign_value_to_array(int val[])//数组赋值 {int star;//数组开始位printf("请输入%d个数&#xff1a;",num);for(star0;star&…

电子测量——用C语言设计测量数据误差处理的通用程序

题目要求 参考例2-2-6的解题过程&#xff0c;用C语言或MATLAB设计测量数据误差处理的通用程序&#xff0c;要求如下&#xff1a; &#xff08;1&#xff09;提供测试数据输入、粗大误差判别准则选择等的人机界面&#xff1b; &#xff08;2&#xff09;编写程序使用说明&#…

c语言区简单数据类型,c语言简单数据类型有哪些

c语言中简单的数据类型分别为&#xff1a;1、整型【int、short、long、long long】&#xff1b;2、浮点型【float&#xff0c;double】&#xff1b;3、字符型【char】。 c语言中简单的数据类型分别为&#xff1a; 1、整(数)型int&#xff1a;基本整数型&#xff0c;用于存储整数…

C语言-基本数据类型

C语言中有3种基本数据类型&#xff0c;分别是整型、字符型和实型&#xff08;浮点型&#xff09;&#xff0c;下表列出的是32位平台数据类型的长度及其取值范围 类别名称类型名数据长度取值范围整型[有符号]整型[signed] int32位-2147483648~2147483647(-2^31 ~ 2^31-1)[有符号…

C语言处理excel

思路来源&#xff1a;https://blog.csdn.net/hongzhen91/article/details/57422897 目录 1 写2 读先看 代码&#xff01;结果分析可知 1 写 .csv 是 excel 后缀&#xff0c;跳跃间隔符是 ‘,’ FILE *fp ;fp fopen("./test.csv","w") ; // 写 for (i0 ;…

C语言基础——数据运算

一 运算基础 运算的本质是根据已有数据&#xff0c;进行各种运算处理&#xff0c;得到新的数据。所以&#xff0c;运算的基础就是数据。在数据的表示方法中&#xff0c;声明的变量只是一个空的指代&#xff0c;并没有和具体的数据进行关联。如果要使用变量&#xff0c;就要把数…

C语言数据溢出

文章目录 int 类型char int 类型 unsigned int num -1;printf("%u", num);解析&#xff1a; 首先在寄存器产生一个负数-1&#xff0c;它在计算机中存储的补码是 32个1&#xff0c;共32个二进制位&#xff0c;当按照赋值号赋给无符号num变量时&#xff0c;符号位变成…

C语言 数据处理

在不使用scanf函数如何对输入的数进行逆序输出呢&#xff1f;首先要得到该数的位数&#xff0c;因为需要在顺序输出里使用。 代码如下: int Getfigure(int n) {int tmp0; //计算循环次数while(n ! 0){n / 10;tmp;}return tmp; //该数的位数 } 其次要清楚该处理…