如何比较图像以识别图像中的人?

时间:2015-07-19 02:02:32

标签: opencv image-processing computer-vision image-recognition face-recognition

通过网络摄像头,我可以捕捉到前方人物的图像。然后我显示一个视频。在那之后,我必须弄清楚它是否是同一个人站在前面。我怎样才能做到这一点?互联网的可能性需要许多图像来训练SVM。我只有一张被认可的人的照片。我怎样才能做到这一点?如果可能的话,请提供一些代码示例,因为我是新手。我已经实现了网络摄像头逻辑。只是我需要的图像识别。

1 个答案:

答案 0 :(得分:4)

好的,让我们试一试。

一种相当典型的方法是使用一种叫做特征脸的东西。 OpenCV有一个关于使用EigenFaces进行面部识别的整个部分以及在http://docs.opencv.org/modules/contrib/doc/facerec/facerec_tutorial.html找到的类似方法

但是这假设你有一个可以使用的图像数据库(但这不是一个开始寻找的好地方)。

使用面部/图像功能的方法:

这种方法不一定非常有效,因为它取决于您对某些特征的计算效率。此方法的准确性取决于您定义功能及其加权因子的程度。但尽管如此,这种方法并不一定需要任何机器学习。 (虽然它肯定会有所帮助!)

另一种方法是尝试比较源面和目标面的相似程度。这可以通过比较一组特征来完成。

您要做的第一件事是确定目标图像是否包含面部。 看到 http://docs.opencv.org/master/d7/d8b/tutorial_py_face_detection.html 或者你可以实现找到Here.

的Viola-Jones算法

现在,如果您的面部检测算法尚未执行此操作,您将需要找到目标面部的方向,比例和位置(这对于查找有关人脸的某些特征非常有用)。

现在您需要计算目标人脸的功能。 您可以使用图像特征和描述符(如快速,SIFT和ORB)来计算图像特征并进行比较。 见http://docs.opencv.org/master/dc/dc3/tutorial_py_matcher.html

或者,既然您知道自己处理过脸部,那么您可以计算出有助于区分人物的功能。 例如:

眼睛之间的距离,脸型。鼻子的长度。眼睛的高度。鼻子和嘴巴之间的距离等。

棘手的部分是弄清楚如何可靠地计算特征指标,然后将所有这些指标组合成一个指标。机器学习算法通常用于找到用于组合每个度量的加权因子。

但是您可以使用一些猜测工作来选择初始权重,然后进行一些试验和错误,直到找到一组适合您的权重。

一旦你计算出权重,你可以通过找到源和目标特征之间的平方差来组合它们并将它们全部加在一起。 (如果所有子特征首先被标准化(即始终在0到1范围内)并且加权以使整体度量范围从0到1,则这种方法效果最佳。

假设你有5个特征f0,f1,f2,f3,f4,f5都在0到1之间 这些值是源面和目标面之间的归一化平方差。

你有5个加权因子:0.3,0.1,0.15,0.25,0.2(总和最多1)

您的整体指标将是

Overall Metric = 0.3 * f0 + 0.1 * f2 + 0.15 * f3 + 0.25 * f4 + 0.2 * f5

如果值接近0,则两个面更相似,如果值更接近1则更不相似。在上面的示例中,特征0是最重要的特征,而特征2是最少的。