最近邻分类法
opencv提供了很多人脸识别方法,大多是通用类face::facerecognizer的子类
局部二值模式(LBP)
再来看cv::face:: LBPHFaceRecognizer
类,它的 create方法的前两个参数分别指定
了邻域的大小(半径,单位为像素)和维度(圆上的像素数量,可用于插值)。把得到的LBP图
像分割成一个网格,网格大小由 create方法的第三个参数指定。对网格上的每个区块构建直方
图。最后,把这些直方图的箱子数组合成一个大的向量,得到全局图像模型。对于8×8的网格,
计算256-箱子直方图,得到16384维的向量。
cv:face: LBPHFaceRecognizer类的 train函数对每个参考图像都用上述方法计算
一个很长的向量。每个人脸图像都可看作是高维空间上的一个点。识别器用 predict方法得
个新图像后,就能找到与它距离最近的参考点。该参考点对应的标签就是识别结果,它们的
离就是置信度。这就是最近邻分类器的基本原理。还有一个因素需要考虑:如果输入点与最近
参考点之间的距离太远,就说明它其实并不属于任何类别,那么“距离太远”的判断标准是什么
这由
cv:: face:: LBPHFaceRecognizer
的 create方法的第四个参数决定。
显然,这种方法的原理很简单,并且如果不同的类别在描述空间中生成各自独立的“点云
它的效果就非常好。另外,它只是从最近的邻域中读取分类结果,因而可以处理多个类别,这
是它的一个优势。它的主要缺点是计算量较大—要从这么大的空间中(参考点的数量还可能
多)找出最近的点,需要耗费很长时间。此外,保存这些参考点也要耗费较大的存储空间。