Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/xpath/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Objective c 基于图像的人脸对齐算法_Objective C_Opencv_Computer Vision_Face Detection_Biometrics - Fatal编程技术网

Objective c 基于图像的人脸对齐算法

Objective c 基于图像的人脸对齐算法,objective-c,opencv,computer-vision,face-detection,biometrics,Objective C,Opencv,Computer Vision,Face Detection,Biometrics,假设我有嘴和眼睛的位置/坐标,如何在二维图像上进行基本面部对齐 有什么算法可以用来纠正图像上的人脸对齐吗 面(或图像)对齐是指将一个图像(或您的情况下的面)与另一个(或参考图像/面)对齐。它也被称为图像配准。您可以使用外观(基于强度的注册)或关键点位置(基于特征的注册)来实现这一点。第二类来源于图像运动模型,其中一个图像被视为另一个图像的置换版本 在您的案例中,地标位置(眼睛和鼻子3个点?)为直接基于特征的注册提供了一个很好的参考集。假设您在两个二维图像中都有一组点的位置,x_1和x_2,您可以

假设我有嘴和眼睛的位置/坐标,如何在二维图像上进行基本面部对齐

有什么算法可以用来纠正图像上的人脸对齐吗

面(或图像)对齐是指将一个图像(或您的情况下的面)与另一个(或参考图像/面)对齐。它也被称为图像配准。您可以使用外观(基于强度的注册)或关键点位置(基于特征的注册)来实现这一点。第二类来源于图像运动模型,其中一个图像被视为另一个图像的置换版本

在您的案例中,地标位置(眼睛和鼻子3个点?)为直接基于特征的注册提供了一个很好的参考集。假设您在两个二维图像中都有一组点的位置,
x_1
x_2
,您可以估计相似性变换(旋转、平移、缩放),即将
x_1
映射到
x_2
的平面二维变换
S
。您还可以向其添加反射,不过对于面来说,这很可能是不必要的

可以通过形成正态方程并使用线性回归解决
x_1=Sx_2
系统的线性最小二乘(LS)问题来进行估计。对于5个未知参数(2个旋转、2个平移、1个缩放),您需要3个点(精确为2.5)来解5个方程。可通过直接线性变换(例如,通过应用SVD或矩阵伪逆)获得上述LS的解。对于参考点数量足够多(即自动检测)的情况,使用RANSAC类型的方法进行点过滤和不确定性消除(尽管这里不是您的情况)

估计
S
后,对第二幅图像应用图像扭曲,以获得整个
图像2
的变换网格(像素)坐标。变换将更改像素位置,但不会更改其外观。不可避免地,
图像2
的一些变换区域将位于
图像1
的网格之外,您可以决定这些空位置的值(例如0、NaN等)

更多详情:R.Szeliski“(第4.3节“几何注册”)

在OpenCV中,请参见:,例如
cv::getRotationMatrix2D
cv::getAffineTransform
cv::warpAffine。
注意,为了保留角度和形状,您应该估计并应用相似性变换(仿射的特例)

OpenCV的人脸识别指南中有一个对齐人脸图像的部分:

脚本将给定的图像与眼睛对齐。它是用Python编写的,但是应该很容易翻译成其他语言。我知道Sorin Miron的C#实现:


对于人脸,特征点有很多变化。因此,仅仅通过仿射变换不可能对所有特征点进行完美拟合。完美对齐所有点的唯一方法是扭曲给定点的图像。基本上,您可以对给定点的图像进行三角剖分,并对每个三角形进行仿射扭曲,以获得所有点对齐的扭曲图像。

可以仅根据眼睛位置进行人脸检测

在此,OpenCV、Dlib和MTCNN提供了检测人脸和眼睛的功能。此外,它是一个基于python的框架,但deepface封装了这些方法,并提供了现成的检测和对齐功能

detectFace函数分别在背景中应用检测和对齐

#!pip install deepface
from deepface import DeepFace
backends = ['opencv', 'ssd', 'dlib', 'mtcnn']
DeepFace.detectFace("img.jpg", detector_backend = backends[0])
此外,您可以手动应用检测和对齐

from deepface.commons import functions
img = functions.load_image("img.jpg")
backends = ['opencv', 'ssd', 'dlib', 'mtcnn']

detected_face = functions.detect_face(img = img, detector_backend = backends[3])
plt.imshow(detected_face)

aligned_face = functions.align_face(img = img, detector_backend = backends[3])
plt.imshow(aligned_face)

processed_img = functions.detect_face(img = aligned_face, detector_backend = backends[3])
plt.imshow(processed_img)

一个想法是在眼睛和嘴巴的位置和对齐偏差之间建立一种关系。然后使用此关系通过填充图像矩阵来校正位置,并通过调用具有计算出的比例差的函数来调整比例。