广告
返回顶部
首页 > 资讯 > 精选 >opencv+mediapipe如何实现人脸检测及摄像头实时示例
  • 898
分享到

opencv+mediapipe如何实现人脸检测及摄像头实时示例

2023-06-22 06:06:52 898人浏览 八月长安
摘要

这篇文章主要为大家展示了“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)

opencv+mediapipe如何实现人脸检测及摄像头实时示例

opencv+mediapipe如何实现人脸检测及摄像头实时示例

opencv+mediapipe如何实现人脸检测及摄像头实时示例

单张图像人脸检测

可以通过调用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])

opencv+mediapipe如何实现人脸检测及摄像头实时示例

这是建立的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如何实现人脸检测及摄像头实时示例

以上是“opencv+mediapipe如何实现人脸检测及摄像头实时示例”这篇文章的所有内容,感谢各位的阅读!相信大家都有了一定的了解,希望分享的内容对大家有所帮助,如果还想学习更多知识,欢迎关注编程网精选频道!

--结束END--

本文标题: opencv+mediapipe如何实现人脸检测及摄像头实时示例

本文链接: https://www.lsjlt.com/news/303143.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作