opencvmediapipe 人脸检测+摄像头实时

news/2024/9/21 20:38:25

文章目录

    • 单张人脸关键点检测
    • 单张图像人脸检测
    • 摄像头实时关键点检测

单张人脸关键点检测

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

import cv2 as cv
import  mediapipe as mp
from tqdm import tqdm
import time
import  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_utils
mp_drawing_styles=mp.solutions.drawing_styles# 读取图像img=cv.imread('img.png')# look_img(img)# 将图像模型输入,获取预测结果# BGR转RGB
img_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_image
annotated_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 cv
import  mediapipe as mp
import numpy as np
from tqdm import tqdm
import time
import  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_styles
draw_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转RGB
img_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.x
def get_y(each):return each.y
def 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)).T
print(points.shape)import open3d
point_cloud=open3d.geometry.PointCloud()
point_cloud.points=open3d.utility.Vector3dVector(points)
open3d.visualization.draw_geometries([point_cloud])

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

摄像头实时关键点检测

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

import cv2 as cv
import  mediapipe as mp
from tqdm import tqdm
import time
import  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_utils
mp_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()#计算每秒处理图像的帧数FPSFPS=1/(end_time-start_time)scaler=1img=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')#     breakframe=process_frame(frame)#展示处理后的三通道图像cv.imshow('my_window',frame)if cv.waitKey(1) &0xff==ord('q'):breakcap.release()
cv.destroyAllWindows()

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.pgtn.cn/news/17591.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈,一经查实,立即删除!

相关文章

opencv-mediapipe人脸检测-颜值打分+摄像头实时

文章目录颜值打分摄像头实时检测颜值打分达芬奇指标摄像头实时达芬奇颜值指标颜值打分 定义可视化图像函数 导入三维人脸关键点检测模型 导入可视化函数和可视化样式 将图像模型输入,获取预测结果 BGR转RGB 将RGB图像输入模型,获取预测结果 预测人人脸个…

使用Python,Tesseract更正文本方向

这篇博客将介绍如何使用 Tesseract 的方向和脚本检测 (OSD) 模式执行自动文本方向检测和更正。 orientation and script detection (OSD) 方向和脚本检测 text orientation 文本定向 OSD模式检测并提供了图像中文本的方向,估计的旋转校正角度…

30岁前挣够500万

教你30岁前挣够500万!(不妨看完,心态会改变。) 成功源于自信!相信自己。下边每个字都是价值不菲,你认真看了吗?一艘没有航行目标的船,任何方向的风都是逆风1、你为什么是穷人&#x…

Postgresql Geometry与wkt互转及长度计算

这篇博客将介绍如何使用Postgresql 进行Geometry与wkt互转及长度计算。首先构建表和数据,然后sql计算。 1. pgadmin4下的效果图: 计算距离效果图如下 也可以查看geom渲染效果图 右侧可选择不同的底图属性: 2. 构建数据表及数据sql CRE…

opencv-mediapipe手部关键点识别

文章目录可视化辅助函数单张图片摄像头检测改变关键点数据特征可视化辅助函数 在下面的代码的注释内有大致的操作 基本操作与前面的人脸检测的操作相似,增加了可视化的辅助函数 import matplotlib.pyplot as plt # 使用ipython的魔法方法,将绘制出的图像…

使用Python,OpenCV制作不同风格的素描图(正常,漫画,写实风格)

使用Python,OpenCV制作不同风格的素描图(正常,漫画,写实风格) 这篇博客将介绍如何使用Python,OpenCV制作不同风格的素描图(正常风格,漫画风格,写实风格)。 …

使用Python,OpenCV反转视频

使用Python,OpenCV反转视频 这篇博客将介绍如何使用Python,OpenCV反转视频,可以通过先把帧都保存下来在反转但太浪费时间和内存,用本文的方法又简洁又快速。 效果图 原始视频: 反转视频: 原理 cv.CAP_PROP_FRAME_COUNT 视频文件中的帧数 cv.CAP_PROP_POS_FRAMES …

蓝图基础

蓝图基础 hello1先输出,延迟1.0秒后hello2再输出 设置变量 先输出hello world,延迟1.0秒之后再输出helloworld2, 逐帧输出: 每隔0.2秒打印一行字符串 打印倒三角形 自定义函数计算三角形面积 调用自定义函数