OpenCV 4.10.0
开源计算机视觉
加载中…
搜索中…
无匹配项
公共成员函数 | 受保护的属性 | 所有成员列表
cv::face::FaceRecognizer 类参考abstract

所有面部识别模型的抽象基类。 更多…

#include <opencv2/face.hpp>

cv::face::FaceRecognizer 的协作图

公共成员函数

virtual bool empty () const CV_OVERRIDE=0
 
virtual String getLabelInfo (int label) const
 通过标签获取字符串信息。
 
virtual std::vector< int > getLabelsByString (const String &str) const
 通过字符串获取标签向量。
 
virtual double getThreshold () const =0
 阈值参数访问器 - 适用于默认的 BestMinDist 收集器
 
int predict (InputArray src) const
 
void predict (InputArray src, int &label, double &confidence) const
 预测给定输入图像的标签和关联置信度(例如,距离)。
 
virtual void predict (InputArray src, Ptr< PredictCollector > collector) const =0
 
  • 如果实现 - 将所有预测结果发送到收集器,该收集器可用于某种自定义结果处理

 
virtual void read (const FileNode &fn) CV_OVERRIDE=0
 
virtual void read (const String &filename)
 加载 FaceRecognizer 及其模型状态。
 
virtual void setLabelInfo (int label, const String &strInfo)
 为指定的模型标签设置字符串信息。
 
virtual void setThreshold (double val)=0
 设置模型的阈值。
 
virtual void train (InputArrayOfArrays src, InputArray labels)=0
 使用给定数据和关联标签训练 FaceRecognizer
 
virtual void update (InputArrayOfArrays src, InputArray labels)
 使用给定数据和关联标签更新 FaceRecognizer
 
virtual void write (const String &filename) const
 保存 FaceRecognizer 及其模型状态。
 
virtual void write (FileStorage &fs) const CV_OVERRIDE=0
 
- 从 cv::Algorithm 继承的公共成员函数
 Algorithm ()
 
virtual ~Algorithm ()
 
virtual void clear ()
 清除算法状态。
 
virtual String getDefaultName () const
 
virtual void save (const String &filename) const
 
void write (const Ptr< FileStorage > &fs, const String &name=String()) const
 
void write (FileStorage &fs, const String &name) const
 

受保护的属性

std::map< int, String_labelsInfo
 

额外继承的成员

- 从 cv::Algorithm 继承的静态公共成员函数
template<typename _Tp >
static Ptr< _Tpload (const String &filename, const String &objname=String())
 从文件加载算法。
 
template<typename _Tp >
static Ptr< _TploadFromString (const String &strModel, const String &objname=String())
 从字符串加载算法。
 
template<typename _Tp >
static Ptr< _Tpread (const FileNode &fn)
 从文件节点读取算法。
 
- 从 cv::Algorithm 继承的受保护成员函数
void writeFormat (FileStorage &fs) const
 

详细描述

所有面部识别模型的抽象基类。

OpenCV 中所有面部识别模型都派生自抽象基类 FaceRecognizer,它提供对 OpenCV 中所有面部识别算法的统一访问。

描述

我将更详细地解释 FaceRecognizer,因为它乍一看并不像一个强大的接口。但是:每个 FaceRecognizer 都是一个 Algorithm,因此您可以轻松地获取/设置所有模型内部结构(如果实现允许)。Algorithm 是一个相对较新的 OpenCV 概念,自 2.4 版本开始可用。我建议您查看其描述。

Algorithm 为所有派生类提供以下功能

此外,每个 FaceRecognizer 都支持

注意
在将 FaceRecognizer 接口与 Python 结合使用时,请坚持使用 Python 2。某些底层脚本(如 create_csv)在其他版本(如 Python 3)中无法正常工作。设置阈值 +++++++++++++++++++++++

有时您会遇到这种情况,即您想对预测应用阈值。人脸识别中一个常见的场景是判断一张脸是否属于训练数据集,或者是否是未知的。您可能想知道,为什么FaceRecognizer 中没有公共 API 来设置预测的阈值,但请放心:它受支持。这仅仅意味着在抽象类中没有通用的方法来提供一个接口,用于设置/获取所有可能FaceRecognizer 算法的阈值。设置阈值的合适位置是在特定 FaceRecognizer 的构造函数中,并且由于每个 FaceRecognizer 都是一个 Algorithm(参见上文),因此您可以在运行时获取/设置阈值!

以下是如何在创建模型时为 Eigenfaces 方法设置阈值的示例

// 假设我们想保留 10 个特征脸,并设置阈值为 10.0
int num_components = 10;
double threshold = 10.0;
// 然后,如果要使用置信度阈值的 cv::FaceRecognizer,
// 使用适当的参数创建具体实现
static Ptr< EigenFaceRecognizer > create(int num_components=0, double threshold=DBL_MAX)
std::shared_ptr< _Tp > Ptr
定义 cvstd_wrapper.hpp:23
double threshold(InputArray src, OutputArray dst, double thresh, double maxval, int type)
将固定级别阈值应用于每个数组元素。

有时不可能训练模型,只是为了实验阈值。由于 Algorithm,可以在运行时设置内部模型阈值。让我们看看如何设置/获取我们上面创建的 Eigenface 模型的预测

// 以下行从 Eigenfaces 模型中读取阈值
double current_threshold = model->getDouble("threshold");
// 这一行将阈值设置为 0.0
model->set("threshold", 0.0);

如果您将阈值设置为 0.0(如上所示),那么

//
Mat img = imread("person1/3.jpg", IMREAD_GRAYSCALE);
// 从模型中获取预测。注意:我们在上面将阈值设置为 0.0,
// 由于距离几乎总是大于 0.0,因此您将获得 -1 作为
// 标签,这表示此面孔未知
int predicted_label = model->predict(img);
// ...
n 维密集数组类
定义 mat.hpp:812
@ IMREAD_GRAYSCALE
如果设置,则始终将图像转换为单通道灰度图像(编解码器内部转换)。
定义 imgcodecs.hpp:70
CV_EXPORTS_W Mat imread(const String &filename, int flags=IMREAD_COLOR)
从文件加载图像。

将产生 -1 作为预测标签,表明此面孔未知。

获取 FaceRecognizer 的名称

由于每个 FaceRecognizer 都是一个 Algorithm,因此可以使用 Algorithm::name 获取 FaceRecognizer 的名称

// 创建一个 FaceRecognizer
// 以下是如何获取其名称
String name = model->name();
std::string String
定义 cvstd.hpp:151

成员函数文档

◆ empty()

virtual bool cv::face::FaceRecognizer::empty ( ) const
纯虚

这是一个重载成员函数,为了方便起见提供。它与上面的函数的不同之处仅在于它接受的参数。

cv::Algorithm 重实现。

cv::face::BasicFaceRecognizer 中实现。

◆ getLabelInfo()

virtual String cv::face::FaceRecognizer::getLabelInfo ( int  label) const
virtual
Python
cv.face.FaceRecognizer.getLabelInfo(label) -> retval

通过标签获取字符串信息。

如果提供了未知标签 ID 或者没有与指定标签 ID 关联的标签信息,则该方法将返回空字符串。

◆ getLabelsByString()

virtual std::vector< int > cv::face::FaceRecognizer::getLabelsByString ( const String str) const
virtual
Python
cv.face.FaceRecognizer.getLabelsByString(str) -> retval

通过字符串获取标签向量。

该函数在关联的字符串信息中搜索包含指定子字符串的标签。

◆ getThreshold()

virtual double cv::face::FaceRecognizer::getThreshold ( ) const
纯虚

阈值参数访问器 - 适用于默认的 BestMinDist 收集器

cv::face::BasicFaceRecognizercv::face::LBPHFaceRecognizer 中实现。

◆ predict() [1/3]

int cv::face::FaceRecognizer::predict ( InputArray  src) const
Python
cv.face.FaceRecognizer.predict(src) -> label, confidence
cv.face.FaceRecognizer.predict_collect(src, collector) -> None
cv.face.FaceRecognizer.predict_label(src) -> retval

这是一个重载成员函数,为了方便起见提供。它与上面的函数的不同之处仅在于它接受的参数。

◆ predict() [2/3]

void cv::face::FaceRecognizer::predict ( InputArray  src,
int &  label,
double &  confidence 
) const
Python
cv.face.FaceRecognizer.predict(src) -> label, confidence
cv.face.FaceRecognizer.predict_collect(src, collector) -> None
cv.face.FaceRecognizer.predict_label(src) -> retval

预测给定输入图像的标签和关联置信度(例如,距离)。

参数
src要从中获取预测的样本图像。
label给定图像的预测标签。
confidence与预测标签相关的置信度(例如距离)。

后缀 const 表示预测不会影响内部模型状态,因此该方法可以在不同的线程中安全地调用。

以下示例展示了如何从训练后的模型中获取预测

using namespace cv;
// 在这里执行您的初始化(创建 cv::FaceRecognizer 模型)...
// ...
// 读取样本图像
Mat img = imread("person1/3.jpg", IMREAD_GRAYSCALE);
// 并从 cv::FaceRecognizer 中获取预测
int predicted = model->predict(img);
"黑盒" 表示与磁盘上的文件相关的文件存储。
定义 core.hpp:102

或者获取预测和相关的置信度(例如距离)

using namespace cv;
// 在这里执行您的初始化(创建 cv::FaceRecognizer 模型)...
// ...
Mat img = imread("person1/3.jpg", IMREAD_GRAYSCALE);
// 预测标签和相关置信度(例如距离)的一些变量
int predicted_label = -1;
double predicted_confidence = 0.0;
// 从模型中获取预测和相关置信度
model->predict(img, predicted_label, predicted_confidence);

◆ predict() [3/3]

virtual void cv::face::FaceRecognizer::predict ( InputArray  src,
Ptr< PredictCollector collector 
) const
纯虚
Python
cv.face.FaceRecognizer.predict(src) -> label, confidence
cv.face.FaceRecognizer.predict_collect(src, collector) -> None
cv.face.FaceRecognizer.predict_label(src) -> retval

  • 如果实现 - 将所有预测结果发送到收集器,该收集器可用于某种自定义结果处理

参数
src要从中获取预测的样本图像。
collector接受所有结果的用户定义收集器对象

要实现此方法,您只需执行与 predict(InputArray src, CV_OUT int &label, CV_OUT double &confidence) 中相同的内部循环,但不要尝试获取"最佳"结果,只需使用给定的收集器将其重新发送到调用方即可

◆ read() [1/2]

virtual void cv::face::FaceRecognizer::read ( const FileNode fn)
纯虚
Python
cv.face.FaceRecognizer.read(filename) -> None

这是一个重载成员函数,为了方便起见提供。它与上面的函数的不同之处仅在于它接受的参数。

cv::Algorithm 重实现。

cv::face::BasicFaceRecognizercv::face::BasicFaceRecognizer 中实现。

◆ read() [2/2]

virtual void cv::face::FaceRecognizer::read ( const String filename)
virtual
Python
cv.face.FaceRecognizer.read(filename) -> None

加载 FaceRecognizer 及其模型状态。

从给定的 XML 或 YAML 文件加载持久化模型和状态。每个 FaceRecognizer 必须覆盖 FaceRecognizer::load(FileStorage& fs) 以启用加载模型状态。FaceRecognizer::load(FileStorage& fs) 反过来由 FaceRecognizer::load(const String& filename) 调用,以简化保存模型。

cv::face::BasicFaceRecognizer 中重实现。

◆ setLabelInfo()

virtual void cv::face::FaceRecognizer::setLabelInfo ( int  label,
const String strInfo 
)
virtual
Python
cv.face.FaceRecognizer.setLabelInfo(label, strInfo) -> None

为指定的模型标签设置字符串信息。

如果之前为指定标签设置了字符串信息,则该字符串信息将被提供的 value 替换。

◆ setThreshold()

virtual void cv::face::FaceRecognizer::setThreshold ( double  val)
纯虚

设置模型的阈值。

cv::face::BasicFaceRecognizercv::face::LBPHFaceRecognizer 中实现。

◆ train()

virtual void cv::face::FaceRecognizer::train ( InputArrayOfArrays  src,
InputArray  labels 
)
纯虚
Python
cv.face.FaceRecognizer.train(src, labels) -> None

使用给定数据和关联标签训练 FaceRecognizer

参数
src要学习的面部,即要训练的图像。数据必须以 vector<Mat> 的形式给出。
labels与图像对应的标签必须以 vector<int> 或类型为 CV_32SC1 的 Mat 的形式给出。

以下源代码片段展示了如何在给定的图像集上学习 Fisherfaces 模型。图像使用 imread 读取并推送到 std::vector<Mat> 中。每个图像的标签存储在 std::vector<int> 中(也可以使用类型为 CV_32SC1 的 Mat)。将标签视为该图像所属的主题(人),因此相同的主题(人)应具有相同的标签。对于可用的 FaceRecognizer,您无需关注标签的顺序,只需确保相同的人具有相同的标签即可。

// 保存图像和标签
vector<Mat> images;
vector<int> labels;
// 使用类型为 CV_32SC1 的 Mat
// Mat labels(number_of_samples, 1, CV_32SC1);
// 第一个人的图像
images.push_back(imread("person0/0.jpg", IMREAD_GRAYSCALE)); labels.push_back(0);
images.push_back(imread("person0/1.jpg", IMREAD_GRAYSCALE)); labels.push_back(0);
images.push_back(imread("person0/2.jpg", IMREAD_GRAYSCALE)); labels.push_back(0);
// 第二个人的图像
images.push_back(imread("person1/0.jpg", IMREAD_GRAYSCALE)); labels.push_back(1);
images.push_back(imread("person1/1.jpg", IMREAD_GRAYSCALE)); labels.push_back(1);
images.push_back(imread("person1/2.jpg", IMREAD_GRAYSCALE)); labels.push_back(1);

现在您已经读取了一些图像,我们可以创建一个新的 FaceRecognizer。在此示例中,我将创建一个 Fisherfaces 模型,并决定保留所有可能的 Fisherfaces。

// 创建一个新的 Fisherfaces 模型并保留所有可用的 Fisherfaces,
// 这是此特定 FaceRecognizer 的最常用用法
//
static Ptr< FisherFaceRecognizer > create(int num_components=0, double threshold=DBL_MAX)

最后,在给定的数据集(面部图像和标签)上对其进行训练。

// 这是训练所有可用 cv::FaceRecognizer 的通用接口
// 实现
//
model->train(images, labels);

◆ update()

virtual void cv::face::FaceRecognizer::update ( InputArrayOfArrays  src,
InputArray  labels 
)
virtual
Python
cv.face.FaceRecognizer.update(src, labels) -> None

使用给定数据和关联标签更新 FaceRecognizer

参数
src要学习的面部,即要训练的图像。数据必须以 vector<Mat> 的形式给出。
labels与图像对应的标签必须以 vector<int> 或类型为 CV_32SC1 的 Mat 的形式给出。

此方法更新(可能已训练的)FaceRecognizer,但前提是算法支持。局部二值模式直方图 (LBPH) 识别器(请参阅 createLBPHFaceRecognizer)可以更新。对于 Eigenfaces 和 Fisherfaces 方法,在算法上这是不可能的,您必须使用 FaceRecognizer::train 重新估计模型。无论哪种情况,对 train 的调用都会清空现有的模型并学习一个新的模型,而 update 不会删除任何模型数据。

// 创建一个新的 LBPH 模型(可以更新)并使用默认参数,
// 这是此特定 FaceRecognizer 的最常用用法
//
// 这是训练所有可用 cv::FaceRecognizer 的通用接口
// 实现
//
model->train(images, labels);
// 一些容器用于保存新图像
vector<Mat> newImages;
vector<int> newLabels;
// 您应该向容器中添加一些图像
//
// ...
//
// 现在更新模型就像调用一样简单
model->update(newImages,newLabels);
// 这将保留旧的模型数据并使用从 newImages 中提取的新特征扩展现有模型!
// 创建一个新的 LBPH 模型(可以更新)并使用默认参数,
static Ptr< LBPHFaceRecognizer > create(int radius=1, int neighbors=8, int grid_x=8, int grid_y=8, double threshold=DBL_MAX)

对不支持更新的 Eigenfaces 模型(请参阅 EigenFaceRecognizer::create)调用 update 将抛出类似于以下内容的错误

OpenCV 错误:函数/特性未实现(此 FaceRecognizer (FaceRecognizer.Eigenfaces) 不支持更新,您必须使用 FaceRecognizer::trainupdate 它。)在 update 中,文件 /home/philipp/git/opencv/modules/contrib/src/facerec.cpp,line 305
抛出 'cv::Exception' 实例后调用终止
所有面部识别模型的抽象基类。
定义 face.hpp:158
virtual void update(InputArrayOfArrays src, InputArray labels)
使用给定的数据和关联的标签更新 FaceRecognizer。
virtual void train(InputArrayOfArrays src, InputArray labels)=0
使用给定的数据和关联的标签训练 FaceRecognizer。
void line(InputOutputArray img, Point pt1, Point pt2, const Scalar &color, int thickness=1, int lineType=LINE_8, int shift=0)
绘制连接两个点的线段。
注意
FaceRecognizer 不会存储您的训练图像,因为这将非常占用内存,并且这也不是 FaceRecognizer 的职责。调用者负责维护他们想要使用的数据集。

◆ write() [1/2]

virtual void cv::face::FaceRecognizer::write ( const String filename) const
virtual
Python
cv.face.FaceRecognizer.write(filename) -> None

保存 FaceRecognizer 及其模型状态。

将此模型保存到给定的文件名中,可以是 XML 或 YAML。

参数
filename要存储此 FaceRecognizer 的文件名(可以是 XML/YAML)。

每个 FaceRecognizer 都会覆盖 FaceRecognizer::save(FileStorage& fs) 以保存内部模型状态。FaceRecognizer::save(const String& filename) 将模型的状态保存到给定的文件名。

后缀 const 表示预测不会影响内部模型状态,因此该方法可以在不同的线程中安全地调用。

cv::face::BasicFaceRecognizer 中重新实现。

◆ write() [2/2]

virtual void cv::face::FaceRecognizer::write ( FileStorage fs) const
纯虚
Python
cv.face.FaceRecognizer.write(filename) -> None

这是一个重载的成员函数,为了方便提供。它只在它接受的参数方面与上面的函数不同。将此模型保存到给定的 FileStorage 中。

参数
fs要存储此 FaceRecognizerFileStorage

cv::Algorithm 重新实现。

cv::face::BasicFaceRecognizercv::face::BasicFaceRecognizer 中实现。

成员数据文档

◆ _labelsInfo

std::map<int, String> cv::face::FaceRecognizer::_labelsInfo
protected

此类的文档是从以下文件生成的