写一个使用OpenCV库读取图片并进行人脸检测。 使用Dlib库定位出人脸关键点,比如眼睛、嘴巴、眉毛等。 将检测到的关键点用于生成一个人脸网格,以便于后面进行形变处理。 使用形变算法将人物的面部特征卡通化,如加大眼睛、改变眉毛形状、加大嘴巴等。 通过卡通处理后的面部特征与原始图片进行融合,生成卡通化后的图片。的程序并解释每行代码的含义
时间: 2023-05-21 13:07:39 浏览: 74
下面是使用OpenCV库进行人脸卡通化处理的Python程序:
```
import cv2
import dlib
import numpy as np
from imutils import face_utils
# 读取图片并进行人脸检测
img = cv2.imread("input.jpg")
detector = dlib.get_frontal_face_detector()
rects = detector(img, 0)
if len(rects) > 0:
# 使用Dlib库定位出人脸关键点
predictor = dlib.shape_predictor("shape_predictor_68_face_landmarks.dat")
shape = predictor(img, rects[0])
shape = face_utils.shape_to_np(shape)
# 绘制关键点
for (x, y) in shape:
cv2.circle(img, (x, y), 2, (0, 255, 0), -1)
# 生成人脸网格
hullIndex = cv2.convexHull(np.array([shape[0], shape[1], shape[2], shape[3], shape[4], shape[5], shape[6], shape[7], shape[8], shape[9], shape[10], shape[11], shape[12], shape[13], shape[14], shape[15], shape[16]]))
hull = []
for i in range(len(hullIndex)):
hull.append(hullIndex[i][0])
hull = np.array(hull, dtype=np.int32)
# 进行形变处理
img_cartoon = np.zeros(img.shape, np.uint8)
img_gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
img_blur = cv2.medianBlur(img_gray, 3)
edges = cv2.Laplacian(img_blur, cv2.CV_8U, ksize=5)
ret, mask = cv2.threshold(edges, 100, 255, cv2.THRESH_BINARY_INV)
mask = cv2.dilate(mask, None, iterations=3)
mask = cv2.erode(mask, None, iterations=2)
mask = cv2.GaussianBlur(mask, (5, 5), 100)
img_masked = cv2.bitwise_and(img, img, mask=mask)
# 融合原始图片与卡通处理后的面部特征
img_cartoon = cv2.addWeighted(img_masked, 0.8, img, 0.2, 0)
# 显示结果
cv2.imshow("Original", img)
cv2.imshow("Cartoon", img_cartoon)
cv2.waitKey(0)
cv2.destroyAllWindows()
```
程序中,首先使用cv2.imread读取输入图片,并使用Dlib库的人脸检测器detector查找图片中的人脸。
如果检测到了人脸,则使用Dlib库的形状预测器predictor定位出人脸的68个关键点,并使用face_utils库的shape_to_np将其转换为Numpy数组。
然后,使用关键点生成人脸的凸包并生成人脸网格。
接下来,使用形变算法将人脸卡通化,包括使用Laplacian算子进行边缘检测,生成掩码mask,对mask进行一些形态学处理,最后使用卡通特征融合原始图片生成卡通化后的图片img_cartoon。
最后,使用cv2.imshow显示原始图片和卡通化后的图片,并使用cv2.waitKey和cv2.destroyAllWindows等函数进行图像显示和资源清理。
相关推荐
![zip](https://img-home.csdnimg.cn/images/20210720083736.png)
![pdf](https://img-home.csdnimg.cn/images/20210720083512.png)
![pdf](https://img-home.csdnimg.cn/images/20210720083512.png)
![-](https://csdnimg.cn/download_wenku/file_type_column_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)