您现在的位置是:主页 > news > 网站建设维护管理/杭州网站设计制作
网站建设维护管理/杭州网站设计制作
admin2025/5/21 8:07:00【news】
简介网站建设维护管理,杭州网站设计制作,新手学做免费网站软件,校园网站建设的意义项目要求 在包含(一个或多个)人脸的图片中对脸上的某些部位(嘴巴、眉毛等部位)进行标记。 代码实现 1、导入工具包 import numpy as np import dlib import cv22、对脸上的部位进行定义 在关键点定位的官方文档中,…
网站建设维护管理,杭州网站设计制作,新手学做免费网站软件,校园网站建设的意义项目要求
在包含(一个或多个)人脸的图片中对脸上的某些部位(嘴巴、眉毛等部位)进行标记。
代码实现
1、导入工具包
import numpy as np
import dlib
import cv22、对脸上的部位进行定义
在关键点定位的官方文档中,…
项目要求
在包含(一个或多个)人脸的图片中对脸上的某些部位(嘴巴、眉毛等部位)进行标记。
代码实现
1、导入工具包
import numpy as np
import dlib
import cv2
2、对脸上的部位进行定义
在关键点定位的官方文档中,提取68个关键点来表示脸上的部位。其中:
- 第1个点到第17个点:脸颊;
- 第18个点到第22个点:右边眉毛;
- 第23个点到第27个点:左边眉毛;
- 第28个点到第36个点:鼻子;
- 第37个点到第42个点:右眼;
- 第43个点到第48个点:左眼;
- 第49个点到第68个点:嘴巴。
如下图所示:
FACIAL_LANDMARKS_68_IDXS = dict([("mouth", (48, 68)),("right_eyebrow", (17, 22)),("left_eyebrow", (22, 27)),("right_eye", (36, 42)),("left_eye", (42, 48)),("nose", (27, 36)),("jaw", (0, 17))
])
3、加载dlib库中的人脸检测与关键点定位
detector = dlib.get_frontal_face_detector()
predictor = dlib.shape_predictor('shape_predictor_68_face_landmarks.dat')
4、导入图片并进行预处理
image = cv2.imread('./images/liudehua.jpg')
(h, w) = image.shape[:2]
width=500
r = width / float(w)
dim = (width, int(h * r))
image = cv2.resize(image, dim, interpolation=cv2.INTER_AREA)
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
5、进行人脸检测
rects = detector(gray, 1)
detector()返回的结果是包含着检测到的人脸的方框的左上角坐标和右下角坐标。
6、得到关键点的坐标
shape = predictor(gray, rect)
此处返回的shape并不是关键点的坐标,我们需要将其中包含的坐标信息提取出来。
写一个函数 shape_to_np(shape, dtype=“int”) 将shape的返回值转换为能用的坐标信息。
def shape_to_np(shape, dtype="int"):# 创建68*2coords = np.zeros((shape.num_parts, 2), dtype=dtype)# 遍历每一个关键点# 得到坐标for i in range(0, shape.num_parts):coords[i] = (shape.part(i).x, shape.part(i).y)return coords
调用这个函数:
shape = shape_to_np(shape)
7、将每一个关键点绘制在图上
for (name, (i, j)) in FACIAL_LANDMARKS_68_IDXS.items():clone = image.copy()cv2.putText(clone, name, (10, 30), cv2.FONT_HERSHEY_SIMPLEX, 0.7, (0, 0, 255), 2)# 根据位置画点for (x, y) in shape[i:j]:cv2.circle(clone, (x, y), 3, (0, 0, 255), -1)# 提取ROI区域(x, y, w, h) = cv2.boundingRect(np.array([shape[i:j]]))roi = image[y:y + h, x:x + w](h, w) = roi.shape[:2]width=250r = width / float(w)dim = (width, int(h * r))roi = cv2.resize(roi, dim, interpolation=cv2.INTER_AREA)# 显示每一部分cv2.imshow("ROI", roi)cv2.imshow("Image", clone)cv2.waitKey(0)
8、将关键点围出的面部部位在图上标记出来
其中,脸颊部位可以用线连接起来,其他部位用凸包画出。
# 创建两个copy
# overlay and one for the final output image
overlay = image.copy()
output = image.copy()
# 设置一些颜色区域
if colors is None:colors = [(19, 199, 109), (79, 76, 240), (230, 159, 23),(168, 100, 168), (158, 163, 32),(163, 38, 32), (180, 42, 220)]
# 遍历每一个区域
for (i, name) in enumerate(FACIAL_LANDMARKS_68_IDXS.keys()):# 得到每一个点的坐标(j, k) = FACIAL_LANDMARKS_68_IDXS[name]pts = shape[j:k]# 检查位置if name == "jaw":# 用线条连起来for l in range(1, len(pts)):ptA = tuple(pts[l - 1])ptB = tuple(pts[l])cv2.line(overlay, ptA, ptB, colors[i], 2)# 计算凸包else:hull = cv2.convexHull(pts)cv2.drawContours(overlay, [hull], -1, colors[i], -1)
# 叠加在原图上,可以指定比例
cv2.addWeighted(overlay, alpha, output, 1 - alpha, 0, output)# 展示所有区域
output = visualize_facial_landmarks(image, shape)
cv2.imshow("Image", output)
cv2.waitKey(0)
cv2.destroyAllWindows()
如果检测的图片中有两张人脸,只需要加一个循环即可,参考下面的完整代码部分。
完整代码
#导入工具包
import numpy as np
import dlib
import cv2#https://ibug.doc.ic.ac.uk/resources/facial-point-annotations/
#http://dlib.net/files/FACIAL_LANDMARKS_68_IDXS = dict([("mouth", (48, 68)),("right_eyebrow", (17, 22)),("left_eyebrow", (22, 27)),("right_eye", (36, 42)),("left_eye", (42, 48)),("nose", (27, 36)),("jaw", (0, 17))
])def shape_to_np(shape, dtype="int"):# 创建68*2coords = np.zeros((shape.num_parts, 2), dtype=dtype)# 遍历每一个关键点# 得到坐标for i in range(0, shape.num_parts):coords[i] = (shape.part(i).x, shape.part(i).y) # 第i个关键点的横纵坐标。return coordsdef visualize_facial_landmarks(image, shape, colors=None, alpha=0.75):# 创建两个copy# overlay and one for the final output imageoverlay = image.copy()output = image.copy()# 设置一些颜色区域if colors is None:colors = [(19, 199, 109), (79, 76, 240), (230, 159, 23),(168, 100, 168), (158, 163, 32),(163, 38, 32), (180, 42, 220)]# 遍历每一个区域for (i, name) in enumerate(FACIAL_LANDMARKS_68_IDXS.keys()):# 得到每一个点的坐标(j, k) = FACIAL_LANDMARKS_68_IDXS[name]pts = shape[j:k]# 检查位置if name == "jaw":# 用线条连起来for l in range(1, len(pts)):ptA = tuple(pts[l - 1])ptB = tuple(pts[l])cv2.line(overlay, ptA, ptB, colors[i], 2)# 计算凸包else:hull = cv2.convexHull(pts)cv2.drawContours(overlay, [hull], -1, colors[i], -1)# 叠加在原图上,可以指定比例cv2.addWeighted(overlay, alpha, output, 1 - alpha, 0, output)return output# 加载人脸检测与关键点定位
detector = dlib.get_frontal_face_detector()
predictor = dlib.shape_predictor('shape_predictor_68_face_landmarks.dat')# 读取输入数据,预处理
image = cv2.imread('./images/liudehua2.jpg')
(h, w) = image.shape[:2]
width=500
r = width / float(w)
dim = (width, int(h * r))
image = cv2.resize(image, dim, interpolation=cv2.INTER_AREA)
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)# 人脸检测
rects = detector(gray, 1)# 遍历检测到的框
for (_, rect) in enumerate(rects):# 对人脸框进行关键点定位# 转换成ndarrayshape = predictor(gray, rect)shape = shape_to_np(shape)# 遍历每一个部分for (name, (i, j)) in FACIAL_LANDMARKS_68_IDXS.items():clone = image.copy()cv2.putText(clone, name, (10, 30), cv2.FONT_HERSHEY_SIMPLEX,0.7, (0, 0, 255), 2)# 根据位置画点for (x, y) in shape[i:j]:cv2.circle(clone, (x, y), 3, (0, 0, 255), -1)# 提取ROI区域(x, y, w, h) = cv2.boundingRect(np.array([shape[i:j]]))roi = image[y:y + h, x:x + w](h, w) = roi.shape[:2]width=250r = width / float(w)dim = (width, int(h * r))roi = cv2.resize(roi, dim, interpolation=cv2.INTER_AREA)# 显示每一部分cv2.imshow("ROI", roi)cv2.imshow("Image", clone)cv2.waitKey(0)# 展示所有区域output = visualize_facial_landmarks(image, shape)cv2.imshow("Image", output)cv2.waitKey(0)cv2.destroyAllWindows()
最终效果