Objective c 基于图像的人脸对齐算法
假设我有嘴和眼睛的位置/坐标,如何在二维图像上进行基本面部对齐 有什么算法可以用来纠正图像上的人脸对齐吗 面(或图像)对齐是指将一个图像(或您的情况下的面)与另一个(或参考图像/面)对齐。它也被称为图像配准。您可以使用外观(基于强度的注册)或关键点位置(基于特征的注册)来实现这一点。第二类来源于图像运动模型,其中一个图像被视为另一个图像的置换版本 在您的案例中,地标位置(眼睛和鼻子3个点?)为直接基于特征的注册提供了一个很好的参考集。假设您在两个二维图像中都有一组点的位置,Objective c 基于图像的人脸对齐算法,objective-c,opencv,computer-vision,face-detection,biometrics,Objective C,Opencv,Computer Vision,Face Detection,Biometrics,假设我有嘴和眼睛的位置/坐标,如何在二维图像上进行基本面部对齐 有什么算法可以用来纠正图像上的人脸对齐吗 面(或图像)对齐是指将一个图像(或您的情况下的面)与另一个(或参考图像/面)对齐。它也被称为图像配准。您可以使用外观(基于强度的注册)或关键点位置(基于特征的注册)来实现这一点。第二类来源于图像运动模型,其中一个图像被视为另一个图像的置换版本 在您的案例中,地标位置(眼睛和鼻子3个点?)为直接基于特征的注册提供了一个很好的参考集。假设您在两个二维图像中都有一组点的位置,x_1和x_2,您可以
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的人脸识别指南中有一个对齐人脸图像的部分:
#!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)
一个想法是在眼睛和嘴巴的位置和对齐偏差之间建立一种关系。然后使用此关系通过填充图像矩阵来校正位置,并通过调用具有计算出的比例差的函数来调整比例。