OpenCV 4.11.0
开源计算机视觉库
加载中…
搜索中…
无匹配项
cv::face::FaceRecognizer 类参考抽象类

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

#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为所有派生类提供以下功能

  • 所谓的“虚拟构造函数”。也就是说,每个Algorithm派生类都在程序启动时注册,您可以通过其名称获取已注册算法的列表并创建特定算法的实例(参见Algorithm::create)。如果您计划添加自己的算法,最好为您的算法添加一个唯一的前缀,以将其与其他算法区分开来。
  • 按名称设置/检索算法参数。如果您使用过OpenCV highgui模块的视频捕获功能,您可能熟悉cv::cvSetCaptureProperty、ocvcvGetCaptureProperty、VideoCapture::setVideoCapture::getAlgorithm提供了类似的方法,您使用文本字符串指定参数名称而不是整数ID。有关详细信息,请参见Algorithm::set和Algorithm::get。
  • 从XML或YAML文件读取和写入参数。每个Algorithm派生类都可以存储其所有参数,然后读取它们。无需每次都重新实现它。

此外,每个FaceRecognizer都支持

  • 训练使用给定数据集和关联标签的FaceRecognizer,使用FaceRecognizer::train训练给定图像集(您的面部数据库!)。
  • 预测给定样本图像,即人脸。图像作为Mat给出。
  • 加载/保存模型状态到/从给定的XML或YAML。
  • 设置/获取标签信息,存储为字符串。字符串标签信息对于保存已识别人员的名称很有用。
注意
当将FaceRecognizer接口与Python结合使用时,请坚持使用Python 2。某些底层脚本(如create_csv)在其他版本(如Python 3)中无法工作。设置阈值+++++++++++++++++++++++++

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

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

// 假设我们想要保留10个Eigenfaces,并且阈值为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:829
@ IMREAD_GRAYSCALE
如果设置,则始终将图像转换为单通道灰度图像(编解码器内部转换)。
定义 imgcodecs.hpp:70
CV_EXPORTS_W Mat imread(const String &filename, int flags=IMREAD_COLOR_BGR)
从文件中加载图像。

将会产生 -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:107

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

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::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

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

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

◆ 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提取的新特征!
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错误:未实现该函数/功能(此FaceRecognizerFaceRecognizer.Eigenfaces)不支持更新,你必须使用FaceRecognizer::trainupdate它。)在update中,文件/home/philipp/git/opencv/modules/contrib/src/facerec.cpp,line 305
'cv::Exception'实例抛出后调用terminate
所有脸部识别模型的抽象基类。
定义 face.hpp:158
virtual void update(InputArrayOfArrays src, InputArray labels)
使用给定的数据和关联的标签更新FaceRecognizer。
virtual void train(InputArrayOfArrays src, InputArray labels)=0
使用给定的数据和关联的标签训练FaceRecognizer。
void terminate(int code, const String &err, const char *func, const char *file, int line) CV_NOEXCEPT
发出错误信号并终止应用程序。
void line(InputOutputArray img, Point pt1, Point pt2, const Scalar &color, int thickness=1, int lineType=LINE_8, int shift=0)
绘制连接两点的线段。
注意
FaceRecognizer 不存储您的训练图像,因为这将非常占用内存,而且这并非 FaceRecognizer 的职责。调用者负责维护其想要使用的dataset。

◆ 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::BasicFaceRecognizer 中实现。

成员数据文档

◆ _labelsInfo

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

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