用python库或API接口实现自动抠图人脸?
时间: 2024-02-15 22:04:52 浏览: 183
Python+opencv-python实现摄像头抽帧人脸监测并抠出人脸
可以使用Python中的OpenCV和Dlib库来实现自动抠图人脸的功能。以下是一个简单的示例代码:
```python
import cv2
import dlib
# 加载Haar级联分类器,用于检测人脸
face_cascade = cv2.CascadeClassifier('haarcascade_frontalface_default.xml')
# 加载Dlib的人脸检测器和面部标志检测器
detector = dlib.get_frontal_face_detector()
predictor = dlib.shape_predictor('shape_predictor_68_face_landmarks.dat')
# 加载图像
img = cv2.imread('input.jpg')
# 转换为灰度图像
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
# 使用Haar级联分类器检测人脸
faces = face_cascade.detectMultiScale(gray, 1.3, 5)
# 对每个检测到的人脸进行处理
for (x, y, w, h) in faces:
# 使用Dlib人脸检测器检测面部标志
rect = dlib.rectangle(int(x), int(y), int(x + w), int(y + h))
landmarks = predictor(gray, rect)
# 提取面部标志中的左眼、右眼、鼻子和嘴巴的坐标
left_eye = (landmarks.part(36).x, landmarks.part(36).y, landmarks.part(39).x, landmarks.part(39).y)
right_eye = (landmarks.part(42).x, landmarks.part(42).y, landmarks.part(45).x, landmarks.part(45).y)
nose = (landmarks.part(27).x, landmarks.part(27).y, landmarks.part(35).x, landmarks.part(35).y)
mouth = (landmarks.part(48).x, landmarks.part(48).y, landmarks.part(54).x, landmarks.part(54).y)
# 根据面部标志的坐标抠出人脸
mask = np.zeros_like(gray)
cv2.fillPoly(mask, [np.array([left_eye, right_eye, nose, mouth], dtype=np.int32)], 255)
masked_img = cv2.bitwise_and(img, img, mask=mask)
# 显示结果
cv2.imshow('Input', img)
cv2.imshow('Output', masked_img)
cv2.waitKey(0)
```
在上面的代码中,我们首先使用Haar级联分类器检测人脸,然后使用Dlib人脸检测器和面部标志检测器提取面部标志的坐标。最后,我们根据面部标志的坐标抠出人脸,并显示结果。注意,需要先安装OpenCV和Dlib库,并下载相应的分类器和模型文件。
阅读全文