opencv给人脸加墨镜
时间: 2023-10-17 10:08:49 浏览: 155
可以使用OpenCV的图像处理功能为人脸添加墨镜。具体步骤如下:
1. 使用OpenCV中的Haar级联分类器检测人脸。可以使用已经训练好的模型,也可以自己训练一个模型。
2. 对检测到的人脸进行关键点检测,确定眼睛的位置。
3. 加载墨镜图像,并将其调整为适合眼睛大小的尺寸。
4. 将墨镜图像与人脸图像叠加。
5. 保存处理后的图像。
以下是代码示例,其中使用了OpenCV中的Haar级联分类器和Dlib库的人脸关键点检测功能:
```python
import cv2
import dlib
# 加载Haar级联分类器检测人脸
face_cascade = cv2.CascadeClassifier('haarcascade_frontalface_default.xml')
# 加载Dlib库的人脸关键点检测器
predictor_path = "shape_predictor_68_face_landmarks.dat"
detector = dlib.get_frontal_face_detector()
predictor = dlib.shape_predictor(predictor_path)
# 加载墨镜图像
glasses = cv2.imread('glasses.png', cv2.IMREAD_UNCHANGED)
# 读取人脸图像
img = cv2.imread('face.jpg')
# 将图像转为灰度图像
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
# 检测人脸
faces = face_cascade.detectMultiScale(gray, scaleFactor=1.1, minNeighbors=5)
# 遍历每个检测到的人脸
for (x, y, w, h) in faces:
# 使用Dlib库检测人脸关键点
rect = dlib.rectangle(int(x), int(y), int(x + w), int(y + h))
shape = predictor(gray, rect)
landmarks = [(shape.part(i).x, shape.part(i).y) for i in range(36, 48)]
# 确定眼睛的位置
left_eye = landmarks[0:6]
right_eye = landmarks[6:12]
left_eye_center = (int(sum([p[0] for p in left_eye]) / 6), int(sum([p[1] for p in left_eye]) / 6))
right_eye_center = (int(sum([p[0] for p in right_eye]) / 6), int(sum([p[1] for p in right_eye]) / 6))
# 调整墨镜尺寸
glasses_width = int(1.5 * abs(right_eye_center[0] - left_eye_center[0]))
glasses_height = int(glasses_width * glasses.shape[0] / glasses.shape[1])
glasses_resized = cv2.resize(glasses, (glasses_width, glasses_height))
# 将墨镜图像与人脸图像叠加
x1 = left_eye_center[0] - int(glasses_width / 2)
y1 = left_eye_center[1] - int(glasses_height / 2)
x2 = x1 + glasses_width
y2 = y1 + glasses_height
alpha_s = glasses_resized[:, :, 3] / 255.0
alpha_l = 1.0 - alpha_s
for c in range(0, 3):
img[y1:y2, x1:x2, c] = (alpha_s * glasses_resized[:, :, c] + alpha_l * img[y1:y2, x1:x2, c])
# 显示结果
cv2.imshow('result', img)
cv2.waitKey(0)
cv2.destroyAllWindows()
```
注意,这只是一个简单的示例,实际应用中可能需要进行更多的优化和调整。
阅读全文