0


opencv&mediapipe 人脸检测+摄像头实时

文章目录

单张人脸关键点检测

定义可视化图像函数
导入三维人脸关键点检测模型
导入可视化函数和可视化样式
读取图像
将图像模型输入,获取预测结果
BGR转RGB
将RGB图像输入模型,获取预测结果
预测人人脸个数
可视化人脸关键点检测效果
绘制人来脸和重点区域轮廓线,返回annotated_image
绘制人脸轮廓、眼睫毛、眼眶、嘴唇
在三维坐标中分别可视化人脸网格、轮廓、瞳孔

  1. import cv2 as cv
  2. import mediapipe as mp
  3. from tqdm import tqdm
  4. import time
  5. import matplotlib.pyplot as plt
  6. # 定义可视化图像函数deflook_img(img):
  7. img_RGB=cv.cvtColor(img,cv.COLOR_BGR2RGB)
  8. plt.imshow(img_RGB)
  9. plt.show()# 导入三维人脸关键点检测模型
  10. mp_face_mesh=mp.solutions.face_mesh
  11. # help(mp_face_mesh.FaceMesh)
  12. model=mp_face_mesh.FaceMesh(
  13. static_image_mode=True,#TRUE:静态图片/False:摄像头实时读取
  14. refine_landmarks=True,#使用Attention Mesh模型
  15. min_detection_confidence=0.5,#置信度阈值,越接近1越准
  16. min_tracking_confidence=0.5,#追踪阈值)# 导入可视化函数和可视化样式
  17. mp_drawing=mp.solutions.drawing_utils
  18. mp_drawing_styles=mp.solutions.drawing_styles
  19. # 读取图像
  20. img=cv.imread('img.png')# look_img(img)# 将图像模型输入,获取预测结果# BGRRGB
  21. img_RGB=cv.cvtColor(img,cv.COLOR_BGR2RGB)# RGB图像输入模型,获取预测结果
  22. results=model.process(img_RGB)# 预测人人脸个数len(results.multi_face_landmarks)print(len(results.multi_face_landmarks))# 结果:1# 可视化人脸关键点检测效果# 绘制人来脸和重点区域轮廓线,返回annotated_image
  23. annotated_image=img.copy()if results.multi_face_landmarks:#如果检测出人脸for face_landmarks in results.multi_face_landmarks:#遍历每一张脸#绘制人脸网格
  24. mp_drawing.draw_landmarks(
  25. image=annotated_image,
  26. landmark_list=face_landmarks,
  27. connections=mp_face_mesh.FACEMESH_TESSELATION,#landmark_drawing_spec为关键点可视化样式,None为默认样式(不显示关键点)# landmark_drawing_spec=mp_drawing_styles.DrawingSpec(thickness=1,circle_radius=2,color=[66,77,229]),
  28. landmark_drawing_spec=None,
  29. connection_drawing_spec=mp_drawing_styles.get_default_face_mesh_tesselation_style())#绘制人脸轮廓、眼睫毛、眼眶、嘴唇
  30. mp_drawing.draw_landmarks(
  31. image=annotated_image,
  32. landmark_list=face_landmarks,
  33. connections=mp_face_mesh.FACEMESH_CONTOURS,# landmark_drawing_spec为关键点可视化样式,None为默认样式(不显示关键点)# landmark_drawing_spec=mp_drawing_styles.DrawingSpec(thickness=1,circle_radius=2,color=[66,77,229]),
  34. landmark_drawing_spec=None,
  35. connection_drawing_spec=mp_drawing_styles.get_default_face_mesh_tesselation_style())#绘制瞳孔区域
  36. mp_drawing.draw_landmarks(
  37. image=annotated_image,
  38. landmark_list=face_landmarks,
  39. connections=mp_face_mesh.FACEMESH_IRISES,# landmark_drawing_spec为关键点可视化样式,None为默认样式(不显示关键点)
  40. landmark_drawing_spec=mp_drawing_styles.DrawingSpec(thickness=1,circle_radius=2,color=[128,256,229]),# landmark_drawing_spec=None,
  41. connection_drawing_spec=mp_drawing_styles.get_default_face_mesh_tesselation_style())
  42. cv.imwrite('test.jpg',annotated_image)
  43. look_img(annotated_image)# 在三维坐标中分别可视化人脸网格、轮廓、瞳孔
  44. mp_drawing.plot_landmarks(results.multi_face_landmarks[0],mp_face_mesh.FACEMESH_TESSELATION)
  45. mp_drawing.plot_landmarks(results.multi_face_landmarks[0],mp_face_mesh.FACEMESH_CONTOURS)
  46. mp_drawing.plot_landmarks(results.multi_face_landmarks[0],mp_face_mesh.FACEMESH_IRISES)

请添加图片描述
请添加图片描述
请添加图片描述

单张图像人脸检测

可以通过调用open3d实现3d模型建立,部分代码与上面类似

  1. import cv2 as cv
  2. import mediapipe as mp
  3. import numpy as np
  4. from tqdm import tqdm
  5. import time
  6. import matplotlib.pyplot as plt
  7. # 定义可视化图像函数deflook_img(img):
  8. img_RGB=cv.cvtColor(img,cv.COLOR_BGR2RGB)
  9. plt.imshow(img_RGB)
  10. plt.show()# 导入三维人脸关键点检测模型
  11. mp_face_mesh=mp.solutions.face_mesh
  12. # help(mp_face_mesh.FaceMesh)
  13. model=mp_face_mesh.FaceMesh(
  14. static_image_mode=True,#TRUE:静态图片/False:摄像头实时读取
  15. refine_landmarks=True,#使用Attention Mesh模型
  16. max_num_faces=40,
  17. min_detection_confidence=0.2,#置信度阈值,越接近1越准
  18. min_tracking_confidence=0.5,#追踪阈值)# 导入可视化函数和可视化样式
  19. mp_drawing=mp.solutions.drawing_utils
  20. # mp_drawing_styles=mp.solutions.drawing_styles
  21. draw_spec=mp_drawing.DrawingSpec(thickness=2,circle_radius=1,color=[223,155,6])# 读取图像
  22. img=cv.imread('../人脸三维关键点检测/dkx.jpg')# width=img1.shape[1]# height=img1.shape[0]# img=cv.resize(img1,(width*10,height*10))# look_img(img)# 将图像模型输入,获取预测结果# BGRRGB
  23. img_RGB=cv.cvtColor(img,cv.COLOR_BGR2RGB)# RGB图像输入模型,获取预测结果
  24. results=model.process(img_RGB)# # 预测人人脸个数# len(results.multi_face_landmarks)## print(len(results.multi_face_landmarks))if results.multi_face_landmarks:for face_landmarks in results.multi_face_landmarks:
  25. mp_drawing.draw_landmarks(
  26. image=img,
  27. landmark_list=face_landmarks,
  28. connections=mp_face_mesh.FACEMESH_CONTOURS,
  29. landmark_drawing_spec=draw_spec,
  30. connection_drawing_spec=draw_spec
  31. )else:print('未检测出人脸')
  32. look_img(img)
  33. mp_drawing.plot_landmarks(results.multi_face_landmarks[0],mp_face_mesh.FACEMESH_TESSELATION)
  34. mp_drawing.plot_landmarks(results.multi_face_landmarks[1],mp_face_mesh.FACEMESH_CONTOURS)
  35. mp_drawing.plot_landmarks(results.multi_face_landmarks[1],mp_face_mesh.FACEMESH_IRISES)# 交互式三维可视化
  36. coords=np.array(results.multi_face_landmarks[0].landmark)# print(len(coords))# print(coords)defget_x(each):return each.x
  37. defget_y(each):return each.y
  38. defget_z(each):return each.z
  39. # 分别获取所有关键点的XYZ坐标
  40. points_x=np.array(list(map(get_x,coords)))
  41. points_y=np.array(list(map(get_y,coords)))
  42. points_z=np.array(list(map(get_z,coords)))# 将三个方向的坐标合并
  43. points=np.vstack((points_x,points_y,points_z)).T
  44. print(points.shape)import open3d
  45. point_cloud=open3d.geometry.PointCloud()
  46. point_cloud.points=open3d.utility.Vector3dVector(points)
  47. open3d.visualization.draw_geometries([point_cloud])

请添加图片描述
这是建立的3d的可视化模型,可以通过鼠标拖动将其旋转

摄像头实时关键点检测

定义可视化图像函数
导入三维人脸关键点检测模型
导入可视化函数和可视化样式
读取单帧函数
主要代码和上面的图像类似

  1. import cv2 as cv
  2. import mediapipe as mp
  3. from tqdm import tqdm
  4. import time
  5. import matplotlib.pyplot as plt
  6. # 导入三维人脸关键点检测模型
  7. mp_face_mesh=mp.solutions.face_mesh
  8. # help(mp_face_mesh.FaceMesh)
  9. model=mp_face_mesh.FaceMesh(
  10. static_image_mode=False,#TRUE:静态图片/False:摄像头实时读取
  11. refine_landmarks=True,#使用Attention Mesh模型
  12. max_num_faces=5,#最多检测几张人脸
  13. min_detection_confidence=0.5,#置信度阈值,越接近1越准
  14. min_tracking_confidence=0.5,#追踪阈值)# 导入可视化函数和可视化样式
  15. mp_drawing=mp.solutions.drawing_utils
  16. mp_drawing_styles=mp.solutions.drawing_styles
  17. # 处理单帧的函数defprocess_frame(img):#记录该帧处理的开始时间
  18. start_time=time.time()
  19. img_RGB=cv.cvtColor(img,cv.COLOR_BGR2RGB)
  20. results=model.process(img_RGB)if results.multi_face_landmarks:for face_landmarks in results.multi_face_landmarks:# mp_drawing.draw_detection(# image=img,# landmarks_list=face_landmarks,# connections=mp_face_mesh.FACEMESH_TESSELATION,# landmarks_drawing_spec=None,# landmarks_drawing_spec=mp_drawing_styles.get_default_face_mesh_tesselation_style()# )# 绘制人脸网格
  21. mp_drawing.draw_landmarks(
  22. image=img,
  23. landmark_list=face_landmarks,
  24. connections=mp_face_mesh.FACEMESH_TESSELATION,# landmark_drawing_spec为关键点可视化样式,None为默认样式(不显示关键点)# landmark_drawing_spec=mp_drawing_styles.DrawingSpec(thickness=1,circle_radius=2,color=[66,77,229]),
  25. landmark_drawing_spec=None,
  26. connection_drawing_spec=mp_drawing_styles.get_default_face_mesh_tesselation_style())# 绘制人脸轮廓、眼睫毛、眼眶、嘴唇
  27. mp_drawing.draw_landmarks(
  28. image=img,
  29. landmark_list=face_landmarks,
  30. connections=mp_face_mesh.FACEMESH_CONTOURS,# landmark_drawing_spec为关键点可视化样式,None为默认样式(不显示关键点)# landmark_drawing_spec=mp_drawing_styles.DrawingSpec(thickness=1,circle_radius=2,color=[66,77,229]),
  31. landmark_drawing_spec=None,
  32. connection_drawing_spec=mp_drawing_styles.get_default_face_mesh_tesselation_style())# 绘制瞳孔区域
  33. mp_drawing.draw_landmarks(
  34. image=img,
  35. landmark_list=face_landmarks,
  36. connections=mp_face_mesh.FACEMESH_IRISES,# landmark_drawing_spec为关键点可视化样式,None为默认样式(不显示关键点)# landmark_drawing_spec=mp_drawing_styles.DrawingSpec(thickness=1, circle_radius=2, color=[0, 1, 128]),
  37. landmark_drawing_spec=None,
  38. connection_drawing_spec=mp_drawing_styles.get_default_face_mesh_tesselation_style())else:
  39. img = cv.putText(img,'NO FACE DELECTED',(25,50), cv.FONT_HERSHEY_SIMPLEX,1.25,(218,112,214),1,8)#记录该帧处理完毕的时间
  40. end_time=time.time()#计算每秒处理图像的帧数FPS
  41. FPS=1/(end_time-start_time)
  42. scaler=1
  43. img=cv.putText(img,'FPS'+str(int(FPS)),(25*scaler,100*scaler),cv.FONT_HERSHEY_SIMPLEX,1.25*scaler,(0,0,255),1,8)return img
  44. # 调用摄像头
  45. cap=cv.VideoCapture(0)
  46. cap.open(0)# 无限循环,直到break被触发while cap.isOpened():
  47. success,frame=cap.read()# if not success:# print('ERROR')# break
  48. frame=process_frame(frame)#展示处理后的三通道图像
  49. cv.imshow('my_window',frame)if cv.waitKey(1)&0xff==ord('q'):break
  50. cap.release()
  51. cv.destroyAllWindows()


本文转载自: https://blog.csdn.net/weixin_52465909/article/details/122183470
版权归原作者 墙缝里的草 所有, 如有侵权,请联系我们删除。

“opencv&mediapipe 人脸检测+摄像头实时”的评论:

还没有评论