如何利用OpenCV dlib实现人脸采集
发表于:2025-11-10 作者:千家信息网编辑
千家信息网最后更新 2025年11月10日,本篇内容主要讲解"如何利用OpenCV dlib实现人脸采集",感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习"如何利用OpenCV dlib实现人脸采集"吧!
千家信息网最后更新 2025年11月10日如何利用OpenCV dlib实现人脸采集
本篇内容主要讲解"如何利用OpenCV dlib实现人脸采集",感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习"如何利用OpenCV dlib实现人脸采集"吧!
1. 效果图
先上一张检测完的图:
也可以每一部分先标识出来:
2. 原理
面部标志主要是: 口 右眉 左眉 右眼 左眼 鼻子 下颚线
这一节即提取这些部分;
从图中可以看到假设是以0为下标的数组:
嘴唇可以认为是: points [48, 68]. 内嘴唇:[60,68]
右眉毛 points [17, 22].
左眉毛 points [22, 27].
右眼 [36, 42].
左眼 [42, 48].
鼻子 [27, 35].
下颌 [0, 17].
已经知道下标,数组切片,并用不同的颜色来标识各个部位,imutils包,可以帮助我们更优雅的写代码的包;已经有封装好方法face_utils 。
嘴唇等是闭合区域,用闭合的凸包表示,下颌用线勾勒;
面部标志检测返回结果是:68个(x,y)坐标:
(1)先转为适合OpenCV处理的 Numpy array,
(2)数组切片,用不同的颜色标识不同的面部结构部分;
3. 源码
# 安装了dlib# imutils 是最新的版本# python detect_face_parts.py --shape-predictor shape_predictor_68_face_landmarks.dat --image images/girl.jpgfrom imutils import face_utilsimport numpy as npimport argparseimport imutilsimport dlibimport cv2import shutilimport os# 构建命令行参数# --shape-predictor 必须 形状检测器位置# --image 必须 待检测的图片ap = argparse.ArgumentParser()ap.add_argument("-p", "--shape-predictor", required=True, help="path to facial landmark predictor")ap.add_argument("-i", "--image", required=True, help="path to input image")args = vars(ap.parse_args())temp_dir = "temp"shutil.rmtree(temp_dir, ignore_errors=True)os.makedirs(temp_dir)# 初始化dlib中基于HOG的面部检测器,及形状预测器detector = dlib.get_frontal_face_detector()predictor = dlib.shape_predictor(args["shape_predictor"])# 加载待检测的图片,resize,并且装换为灰度图image = cv2.imread(args["image"])image = imutils.resize(image, width=500)gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)# 在灰度图中检测面部rects = detector(gray, 1)# 循环检测到的面部num = 0for (i, rect) in enumerate(rects): # 确定面部区域进行面部标志检测,并将其检测到的68个点转换为方便python处理的Numpy array shape = predictor(gray, rect) shape = face_utils.shape_to_np(shape) # 循环遍历面部标志独立的每一部分 for (name, (i, j)) in face_utils.FACIAL_LANDMARKS_IDXS.items(): # 复制一张原始图的拷贝,以便于绘制面部区域,及其名称 clone = image.copy() cv2.putText(clone, name, (10, 30), cv2.FONT_HERSHEY_SIMPLEX, 0.7, (0, 0, 255), 2) # 遍历独立的面部标志的每一部分包含的点,并画在图中 for (x, y) in shape[i:j]: cv2.circle(clone, (x, y), 1, (0, 0, 255), -1) # 要实际提取每个面部区域,我们只需要计算与特定区域关联的(x,y)坐标的边界框,并使用NumPy数组切片来提取它: (x, y, w, h) = cv2.boundingRect(np.array([shape[i:j]])) roi = image[y:y + h, x:x + w] # resize ROI区域为 宽度250,以便于更好的可视化 roi = imutils.resize(roi, width=250, inter=cv2.INTER_CUBIC) # 展示独立的面部标志 cv2.imshow("ROI", roi) cv2.imshow("Image", clone) cv2.waitKey(0) num = num + 1 p = os.path.sep.join([temp_dir, "{}.jpg".format( str(num).zfill(8))]) print('p: ', p) cv2.imwrite(p, output) # 应用visualize_facial_landmarks 功能为每个面部部位创建透明的覆盖层。(transparent overlay) output = face_utils.visualize_facial_landmarks(image, shape) cv2.imshow("Image", output) cv2.waitKey(0)到此,相信大家对"如何利用OpenCV dlib实现人脸采集"有了更深的了解,不妨来实际操作一番吧!这里是网站,更多相关内容可以进入相关频道进行查询,关注我们,继续学习!
面部
检测
区域
标志
数组
人脸
不同
嘴唇
标识
图中
独立
下标
下颌
内容
右眼
图片
坐标
实际
左眼
形状
数据库的安全要保护哪些东西
数据库安全各自的含义是什么
生产安全数据库录入
数据库的安全性及管理
数据库安全策略包含哪些
海淀数据库安全审计系统
建立农村房屋安全信息数据库
易用的数据库客户端支持安全管理
连接数据库失败ssl安全错误
数据库的锁怎样保障安全
医院系统的软件开发
vb中的sql数据库
软件开发安装程序vb
服务器最强芯片
联想服务器推荐
青海卫视家庭教育和网络安全
易语言两个数据库的数据怎么对比
数据库设置数据有效期
我的世界服务器分享站
盈利大的软件开发方向
马鞍山企业软件开发公司
互动网络安全打卡
怎样修改接入点服务器提高网速
美国服务器100m
普尔网络安全黑板报
云服务器租用服务方案
河源通信软件开发优化价格
密云区信息网络技术推广怎么样
离散制造软件开发信息核心技术
数据库系统和数据库原理
人工智能ai服务器拆解
数据结构与数据库严蔚敏
如何学习计算机网络技术视频
安卓手机软件开发买卖
2022年网络安全宣传周素材
联想与联想中国pc及服务器工厂
财务服务器维护合同
萨特勒光谱数据库
做软件开发的自我介绍
软件开发和应用设计的区别