这篇文章主要为大家展示了“OpenCV+mediapipe如何实现人脸检测及摄像头实时示例”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“opencv+mediapipe如何实现人脸检测及摄像头实
这篇文章主要为大家展示了“OpenCV+mediapipe如何实现人脸检测及摄像头实时示例”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“opencv+mediapipe如何实现人脸检测及摄像头实时示例”这篇文章吧。
定义可视化图像函数
导入三维人脸关键点检测模型
导入可视化函数和可视化样式
读取图像
将图像模型输入,获取预测结果
BGR转RGB
将RGB图像输入模型,获取预测结果
预测人人脸个数
可视化人脸关键点检测效果
绘制人来脸和重点区域轮廓线,返回annotated_image
绘制人脸轮廓、眼睫毛、眼眶、嘴唇
在三维坐标中分别可视化人脸网格、轮廓、瞳孔
import cv2 as cvimport mediapipe as mpfrom tqdm import tqdmimport timeimport matplotlib.pyplot as plt# 定义可视化图像函数def look_img(img): img_RGB=cv.cvtColor(img,cv.COLOR_BGR2RGB) plt.imshow(img_RGB) plt.show()# 导入三维人脸关键点检测模型mp_face_mesh=mp.solutions.face_mesh# help(mp_face_mesh.FaceMesh)model=mp_face_mesh.FaceMesh( static_image_mode=True,#TRUE:静态图片/False:摄像头实时读取 refine_landmarks=True,#使用Attention Mesh模型 min_detection_confidence=0.5, #置信度阈值,越接近1越准 min_tracking_confidence=0.5,#追踪阈值)# 导入可视化函数和可视化样式mp_drawing=mp.solutions.drawing_utilsmp_drawing_styles=mp.solutions.drawing_styles# 读取图像img=cv.imread('img.png')# look_img(img)# 将图像模型输入,获取预测结果# BGR转RGBimg_RGB=cv.cvtColor(img,cv.COLOR_BGR2RGB)# 将RGB图像输入模型,获取预测结果results=model.process(img_RGB)# 预测人人脸个数len(results.multi_face_landmarks)print(len(results.multi_face_landmarks))# 结果:1# 可视化人脸关键点检测效果# 绘制人来脸和重点区域轮廓线,返回annotated_imageannotated_image=img.copy()if results.multi_face_landmarks: #如果检测出人脸 for face_landmarks in results.multi_face_landmarks:#遍历每一张脸 #绘制人脸网格 mp_drawing.draw_landmarks( image=annotated_image, landmark_list=face_landmarks, 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]), landmark_drawing_spec=None, connection_drawing_spec=mp_drawing_styles.get_default_face_mesh_tesselation_style() ) #绘制人脸轮廓、眼睫毛、眼眶、嘴唇 mp_drawing.draw_landmarks( image=annotated_image, landmark_list=face_landmarks, 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]), landmark_drawing_spec=None, connection_drawing_spec=mp_drawing_styles.get_default_face_mesh_tesselation_style() ) #绘制瞳孔区域 mp_drawing.draw_landmarks( image=annotated_image, landmark_list=face_landmarks, connections=mp_face_mesh.FACEMESH_IRISES, # landmark_drawing_spec为关键点可视化样式,None为默认样式(不显示关键点) landmark_drawing_spec=mp_drawing_styles.DrawingSpec(thickness=1,circle_radius=2,color=[128,256,229]), # landmark_drawing_spec=None, connection_drawing_spec=mp_drawing_styles.get_default_face_mesh_tesselation_style() )cv.imwrite('test.jpg',annotated_image)look_img(annotated_image)# 在三维坐标中分别可视化人脸网格、轮廓、瞳孔mp_drawing.plot_landmarks(results.multi_face_landmarks[0],mp_face_mesh.FACEMESH_TESSELATION)mp_drawing.plot_landmarks(results.multi_face_landmarks[0],mp_face_mesh.FACEMESH_CONTOURS)mp_drawing.plot_landmarks(results.multi_face_landmarks[0],mp_face_mesh.FACEMESH_IRISES)
可以通过调用open3D实现3d模型建立,部分代码与上面类似
import cv2 as cvimport mediapipe as mpimport numpy as npfrom tqdm import tqdmimport timeimport matplotlib.pyplot as plt# 定义可视化图像函数def look_img(img): img_RGB=cv.cvtColor(img,cv.COLOR_BGR2RGB) plt.imshow(img_RGB) plt.show()# 导入三维人脸关键点检测模型mp_face_mesh=mp.solutions.face_mesh# help(mp_face_mesh.FaceMesh)model=mp_face_mesh.FaceMesh( static_image_mode=True,#TRUE:静态图片/False:摄像头实时读取 refine_landmarks=True,#使用Attention Mesh模型 max_num_faces=40, min_detection_confidence=0.2, #置信度阈值,越接近1越准 min_tracking_confidence=0.5,#追踪阈值)# 导入可视化函数和可视化样式mp_drawing=mp.solutions.drawing_utils# mp_drawing_styles=mp.solutions.drawing_stylesdraw_spec=mp_drawing.DrawingSpec(thickness=2,circle_radius=1,color=[223,155,6])# 读取图像img=cv.imread('../人脸三维关键点检测/dkx.jpg')# width=img1.shape[1]# height=img1.shape[0]# img=cv.resize(img1,(width*10,height*10))# look_img(img)# 将图像模型输入,获取预测结果# BGR转RGBimg_RGB=cv.cvtColor(img,cv.COLOR_BGR2RGB)# 将RGB图像输入模型,获取预测结果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: mp_drawing.draw_landmarks( image=img, landmark_list=face_landmarks, connections=mp_face_mesh.FACEMESH_CONTOURS, landmark_drawing_spec=draw_spec, connection_drawing_spec=draw_spec )else: print('未检测出人脸')look_img(img)mp_drawing.plot_landmarks(results.multi_face_landmarks[0],mp_face_mesh.FACEMESH_TESSELATION)mp_drawing.plot_landmarks(results.multi_face_landmarks[1],mp_face_mesh.FACEMESH_CONTOURS)mp_drawing.plot_landmarks(results.multi_face_landmarks[1],mp_face_mesh.FACEMESH_IRISES)# 交互式三维可视化coords=np.array(results.multi_face_landmarks[0].landmark)# print(len(coords))# print(coords)def get_x(each): return each.xdef get_y(each): return each.ydef get_z(each): return each.z# 分别获取所有关键点的XYZ坐标points_x=np.array(list(map(get_x,coords)))points_y=np.array(list(map(get_y,coords)))points_z=np.array(list(map(get_z,coords)))# 将三个方向的坐标合并points=np.vstack((points_x,points_y,points_z)).Tprint(points.shape)import open3dpoint_cloud=open3d.geometry.PointCloud()point_cloud.points=open3d.utility.Vector3dVector(points)open3d.visualization.draw_geometries([point_cloud])
这是建立的3d的可视化模型,可以通过鼠标拖动将其旋转
定义可视化图像函数
导入三维人脸关键点检测模型
导入可视化函数和可视化样式
读取单帧函数
主要代码和上面的图像类似
import cv2 as cvimport mediapipe as mpfrom tqdm import tqdmimport timeimport matplotlib.pyplot as plt# 导入三维人脸关键点检测模型mp_face_mesh=mp.solutions.face_mesh# help(mp_face_mesh.FaceMesh)model=mp_face_mesh.FaceMesh( static_image_mode=False,#TRUE:静态图片/False:摄像头实时读取 refine_landmarks=True,#使用Attention Mesh模型 max_num_faces=5,#最多检测几张人脸 min_detection_confidence=0.5, #置信度阈值,越接近1越准 min_tracking_confidence=0.5,#追踪阈值)# 导入可视化函数和可视化样式mp_drawing=mp.solutions.drawing_utilsmp_drawing_styles=mp.solutions.drawing_styles# 处理单帧的函数def process_frame(img): #记录该帧处理的开始时间 start_time=time.time() img_RGB=cv.cvtColor(img,cv.COLOR_BGR2RGB) 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() # ) # 绘制人脸网格 mp_drawing.draw_landmarks( image=img, landmark_list=face_landmarks, 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]), landmark_drawing_spec=None, connection_drawing_spec=mp_drawing_styles.get_default_face_mesh_tesselation_style() ) # 绘制人脸轮廓、眼睫毛、眼眶、嘴唇 mp_drawing.draw_landmarks( image=img, landmark_list=face_landmarks, 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]), landmark_drawing_spec=None, connection_drawing_spec=mp_drawing_styles.get_default_face_mesh_tesselation_style() ) # 绘制瞳孔区域 mp_drawing.draw_landmarks( image=img, landmark_list=face_landmarks, 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]), landmark_drawing_spec=None, connection_drawing_spec=mp_drawing_styles.get_default_face_mesh_tesselation_style()) else: img = cv.putText(img, 'NO FACE DELECTED', (25 , 50 ), cv.FONT_HERSHEY_SIMPLEX, 1.25, (218, 112, 214), 1, 8) #记录该帧处理完毕的时间 end_time=time.time() #计算每秒处理图像的帧数FPS FPS=1/(end_time-start_time) scaler=1 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# 调用摄像头cap=cv.VideoCapture(0)cap.open(0)# 无限循环,直到break被触发while cap.isOpened(): success,frame=cap.read() # if not success: # print('ERROR') # break frame=process_frame(frame) #展示处理后的三通道图像 cv.imshow('my_window',frame) if cv.waiTKEy(1) &0xff==ord('q'): breakcap.release()cv.destroyAllwindows()
以上是“opencv+mediapipe如何实现人脸检测及摄像头实时示例”这篇文章的所有内容,感谢各位的阅读!相信大家都有了一定的了解,希望分享的内容对大家有所帮助,如果还想学习更多知识,欢迎关注编程网精选频道!
--结束END--
本文标题: opencv+mediapipe如何实现人脸检测及摄像头实时示例
本文链接: https://www.lsjlt.com/news/303143.html(转载时请注明来源链接)
有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341
下载Word文档到电脑,方便收藏和打印~
2024-05-06
2024-05-06
2024-05-06
2024-05-06
2024-05-06
2024-05-06
2024-05-06
2024-05-06
2024-05-06
2024-05-06
回答
回答
回答
回答
回答
回答
回答
回答
回答
回答
0