opencv+mediapipe如何实现人脸检测及摄像头实时示例
发表于:2026-11-03 作者:千家信息网编辑
千家信息网最后更新 2026年11月03日,这篇文章主要为大家展示了"opencv+mediapipe如何实现人脸检测及摄像头实时示例",内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下"opencv+me
千家信息网最后更新 2026年11月03日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如何实现人脸检测及摄像头实时示例"这篇文章的所有内容,感谢各位的阅读!相信大家都有了一定的了解,希望分享的内容对大家有所帮助,如果还想学习更多知识,欢迎关注行业资讯频道!
可视化
人脸
关键
关键点
检测
图像
样式
模型
函数
三维
摄像头
摄像
实时
结果
轮廓
阈值
输入
处理
区域
坐标
数据库的安全要保护哪些东西
数据库安全各自的含义是什么
生产安全数据库录入
数据库的安全性及管理
数据库安全策略包含哪些
海淀数据库安全审计系统
建立农村房屋安全信息数据库
易用的数据库客户端支持安全管理
连接数据库失败ssl安全错误
数据库的锁怎样保障安全
广东猪兼强互联网科技有限公司
蓝思科技飞鸽互联网
互联网科技垄断
合肥互联网科技公司
致骋互联网科技
润盈互联网科技
互联网科技股有哪些
居家互联网科技有限公司
丰台科技园 互联网公司
青岛中康互联网医疗科技有限公司
北京大学互联网科技怎么样
互联网科技教育视频
坤平互联网科技
河南住房之家互联网科技
济南有互联网科技公司吗
群盈汇互联网科技有限公司
北京市互联网新科技
四川互联网展示科技馆设计
互联网科技股为什么大涨
信承诺互联网科技有限公司
互联网和科技创新
盈实互联网科技
金诺互联网科技
互联网与科技金融数据
互联网金融监管科技
中化能源互联网科技招聘
广州恒生互联网科技有限
栖莱科技互联网股份有限公司
互联网相关科技技术
科技和互联网行业的特点