帮我写一个opencv+python的人脸对齐程序
时间: 2023-05-28 10:02:04 浏览: 111
以下是一个基于dlib库的Python人脸对齐程序:
``` python
# 导入必要的库
import cv2
import dlib
import numpy as np
# 初始化dlib的面部检测器和68个面部关键点预测器
detector = dlib.get_frontal_face_detector()
predictor = dlib.shape_predictor('shape_predictor_68_face_landmarks.dat')
# 定义人脸对齐函数
def align_face(img):
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
faces = detector(gray)
# 如果没有检测到面部,则返回原始图像
if len(faces) == 0:
return img
# 获取第一个检测到的面部关键点
shape = predictor(gray, faces[0])
shape = np.array([(p.x, p.y) for p in shape.parts()])
# 计算眼睛中心点
left_eye = shape[36:42].mean(axis=0).astype(np.int)
right_eye = shape[42:48].mean(axis=0).astype(np.int)
# 计算角度和缩放比例
dx = right_eye[0] - left_eye[0]
dy = right_eye[1] - left_eye[1]
angle = np.degrees(np.arctan2(dy, dx))
scale = 1.0
# 计算仿射矩阵
center = tuple(left_eye)
M = cv2.getRotationMatrix2D(center, angle, scale)
# 计算输出图像大小
output_size = img.shape[:2]
# 进行仿射变换
aligned_img = cv2.warpAffine(img, M, output_size, flags=cv2.INTER_LINEAR, borderMode=cv2.BORDER_CONSTANT, borderValue=(0, 0, 0))
return aligned_img
# 加载测试图像
img = cv2.imread('test.jpg')
# 对齐图像
aligned_img = align_face(img)
# 显示结果
cv2.imshow('Original', img)
cv2.imshow('Aligned', aligned_img)
cv2.waitKey(0)
cv2.destroyAllWindows()
```
这个程序会对输入的图像进行人脸检测和关键点提取,然后计算眼睛中心点,并根据眼睛中心点的位置和角度进行仿射变换以对齐人脸。
阅读全文