python 3利用Dlib 19.7实现摄像头人脸检测特征点标定


Posted in Python onFebruary 26, 2018

Python 3 利用 Dlib 19.7 实现摄像头人脸检测特征点标定

0.引言

利用python开发,借助Dlib库捕获摄像头中的人脸,进行实时特征点标定;

python 3利用Dlib 19.7实现摄像头人脸检测特征点标定

图1 工程效果示例(gif)

python 3利用Dlib 19.7实现摄像头人脸检测特征点标定

图2 工程效果示例(静态图片)

(实现比较简单,代码量也比较少,适合入门或者兴趣学习。)

1.开发环境

python:

3.6.3

dlib:

  19.7

OpenCv, numpy

import dlib     # 人脸识别的库dlib
import numpy as np # 数据处理的库numpy
import cv2     # 图像处理的库OpenCv

2.源码介绍

其实实现很简单,主要分为两个部分:摄像头调用+人脸特征点标定

2.1 摄像头调用

介绍下opencv中摄像头的调用方法;

利用 cap = cv2.VideoCapture(0) 创建一个对象;

(具体可以参考官方文档)

# 2018-2-26
# By TimeStamp
# cnblogs: http://www.cnblogs.com/AdaminXie

"""
cv2.VideoCapture(), 创建cv2摄像头对象/ open the default camera

  Python: cv2.VideoCapture() → <VideoCapture object>

  Python: cv2.VideoCapture(filename) → <VideoCapture object>  
  filename ? name of the opened video file (eg. video.avi) or image sequence (eg. img_%02d.jpg, which will read samples like img_00.jpg, img_01.jpg, img_02.jpg, ...)

  Python: cv2.VideoCapture(device) → <VideoCapture object>
  device ? id of the opened video capturing device (i.e. a camera index). If there is a single camera connected, just pass 0.

"""
cap = cv2.VideoCapture(0)


"""
cv2.VideoCapture.set(propId, value),设置视频参数;

  propId:
  CV_CAP_PROP_POS_MSEC Current position of the video file in milliseconds.
  CV_CAP_PROP_POS_FRAMES 0-based index of the frame to be decoded/captured next.
  CV_CAP_PROP_POS_AVI_RATIO Relative position of the video file: 0 - start of the film, 1 - end of the film.
  CV_CAP_PROP_FRAME_WIDTH Width of the frames in the video stream.
  CV_CAP_PROP_FRAME_HEIGHT Height of the frames in the video stream.
  CV_CAP_PROP_FPS Frame rate.
  CV_CAP_PROP_FOURCC 4-character code of codec.
  CV_CAP_PROP_FRAME_COUNT Number of frames in the video file.
  CV_CAP_PROP_FORMAT Format of the Mat objects returned by retrieve() .
  CV_CAP_PROP_MODE Backend-specific value indicating the current capture mode.
  CV_CAP_PROP_BRIGHTNESS Brightness of the image (only for cameras).
  CV_CAP_PROP_CONTRAST Contrast of the image (only for cameras).
  CV_CAP_PROP_SATURATION Saturation of the image (only for cameras).
  CV_CAP_PROP_HUE Hue of the image (only for cameras).
  CV_CAP_PROP_GAIN Gain of the image (only for cameras).
  CV_CAP_PROP_EXPOSURE Exposure (only for cameras).
  CV_CAP_PROP_CONVERT_RGB Boolean flags indicating whether images should be converted to RGB.
  CV_CAP_PROP_WHITE_BALANCE_U The U value of the whitebalance setting (note: only supported by DC1394 v 2.x backend currently)
  CV_CAP_PROP_WHITE_BALANCE_V The V value of the whitebalance setting (note: only supported by DC1394 v 2.x backend currently)
  CV_CAP_PROP_RECTIFICATION Rectification flag for stereo cameras (note: only supported by DC1394 v 2.x backend currently)
  CV_CAP_PROP_ISO_SPEED The ISO speed of the camera (note: only supported by DC1394 v 2.x backend currently)
  CV_CAP_PROP_BUFFERSIZE Amount of frames stored in internal buffer memory (note: only supported by DC1394 v 2.x backend currently)
  
  value: 设置的参数值/ Value of the property
"""
cap.set(3, 480)

"""
cv2.VideoCapture.isOpened(), 检查摄像头初始化是否成功 / check if we succeeded
返回true或false
"""
cap.isOpened()

""" 
cv2.VideoCapture.read([imgage]) -> retval,image, 读取视频 / Grabs, decodes and returns the next video frame
返回两个值:
  一个是布尔值true/false,用来判断读取视频是否成功/是否到视频末尾
  图像对象,图像的三维矩阵
"""
flag, im_rd = cap.read()

2.2 人脸特征点标定

调用预测器“shape_predictor_68_face_landmarks.dat”进行68点标定,这是dlib训练好的模型,可以直接调用进行人脸68个人脸特征点的标定;

具体可以参考我的另一篇博客(python3利用Dlib19.7实现人脸68个特征点标定); 

2.3 源码

实现的方法比较简单:

利用 cv2.VideoCapture() 创建摄像头对象,然后利用 flag, im_rd = cv2.VideoCapture.read() 读取摄像头视频,im_rd就是视频中的一帧帧图像;

然后就类似于单张图像进行人脸检测,对这一帧帧的图像im_rd利用dlib进行特征点标定,然后绘制特征点;

你可以按下s键来获取当前截图,或者按下q键来退出摄像头;

# 2018-2-26

# By TimeStamp
# cnblogs: http://www.cnblogs.com/AdaminXie
# github: https://github.com/coneypo/Dlib_face_detection_from_camera

import dlib           #人脸识别的库dlib
import numpy as np       #数据处理的库numpy
import cv2           #图像处理的库OpenCv

# dlib预测器
detector = dlib.get_frontal_face_detector()
predictor = dlib.shape_predictor('shape_predictor_68_face_landmarks.dat')

# 创建cv2摄像头对象
cap = cv2.VideoCapture(0)

# cap.set(propId, value)
# 设置视频参数,propId设置的视频参数,value设置的参数值
cap.set(3, 480)

# 截图screenshoot的计数器
cnt = 0

# cap.isOpened() 返回true/false 检查初始化是否成功
while(cap.isOpened()):

  # cap.read()
  # 返回两个值:
  #  一个布尔值true/false,用来判断读取视频是否成功/是否到视频末尾
  #  图像对象,图像的三维矩阵
  flag, im_rd = cap.read()

  # 每帧数据延时1ms,延时为0读取的是静态帧
  k = cv2.waitKey(1)

  # 取灰度
  img_gray = cv2.cvtColor(im_rd, cv2.COLOR_RGB2GRAY)

  # 人脸数rects
  rects = detector(img_gray, 0)

  #print(len(rects))

  # 待会要写的字体
  font = cv2.FONT_HERSHEY_SIMPLEX

  # 标68个点
  if(len(rects)!=0):
    # 检测到人脸
    for i in range(len(rects)):
      landmarks = np.matrix([[p.x, p.y] for p in predictor(im_rd, rects[i]).parts()])

      for idx, point in enumerate(landmarks):
        # 68点的坐标
        pos = (point[0, 0], point[0, 1])

        # 利用cv2.circle给每个特征点画一个圈,共68个
        cv2.circle(im_rd, pos, 2, color=(0, 255, 0))

        # 利用cv2.putText输出1-68
        cv2.putText(im_rd, str(idx + 1), pos, font, 0.2, (0, 0, 255), 1, cv2.LINE_AA)
    cv2.putText(im_rd, "faces: "+str(len(rects)), (20,50), font, 1, (0, 0, 255), 1, cv2.LINE_AA)
  else:
    # 没有检测到人脸
    cv2.putText(im_rd, "no face", (20, 50), font, 1, (0, 0, 255), 1, cv2.LINE_AA)

  # 添加说明
  im_rd = cv2.putText(im_rd, "s: screenshot", (20, 400), font, 0.8, (255, 255, 255), 1, cv2.LINE_AA)
  im_rd = cv2.putText(im_rd, "q: quit", (20, 450), font, 0.8, (255, 255, 255), 1, cv2.LINE_AA)

  # 按下s键保存
  if (k == ord('s')):
    cnt+=1
    cv2.imwrite("screenshoot"+str(cnt)+".jpg", im_rd)

  # 按下q键退出
  if(k==ord('q')):
    break

  # 窗口显示
  cv2.imshow("camera", im_rd)

# 释放摄像头
cap.release()

# 删除建立的窗口
cv2.destroyAllWindows()

如果对您有帮助,欢迎在GitHub上star本项目。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
Python中的defaultdict模块和namedtuple模块的简单入门指南
Apr 01 Python
Python自动化测试ConfigParser模块读写配置文件
Aug 15 Python
python如何读写csv数据
Mar 21 Python
python3解析库BeautifulSoup4的安装配置与基本用法
Jun 26 Python
python 读取视频,处理后,实时计算帧数fps的方法
Jul 10 Python
python中将\\uxxxx转换为Unicode字符串的方法
Sep 06 Python
Python中反射和描述器总结
Sep 23 Python
python 快速把超大txt文件转存为csv的实例
Oct 26 Python
Python实现的IP端口扫描工具类示例
Feb 15 Python
linux环境下安装python虚拟环境及注意事项
Jan 07 Python
大数据分析用java还是Python
Jul 06 Python
Selenium python时间控件输入问题解决方案
Jul 22 Python
python3利用Dlib19.7实现人脸68个特征点标定
Feb 26 #Python
python微信跳一跳系列之棋子定位颜色识别
Feb 26 #Python
python微信跳一跳系列之棋子定位像素遍历
Feb 26 #Python
python3.6+opencv3.4实现鼠标交互查看图片像素
Feb 26 #Python
python微信跳一跳系列之自动计算跳一跳距离
Feb 26 #Python
python微信跳一跳系列之色块轮廓定位棋盘
Feb 26 #Python
tensorflow入门之训练简单的神经网络方法
Feb 26 #Python
You might like
IIS php环境配置PHP5 MySQL5 ZendOptimizer phpmyadmin安装与配置
2008/11/18 PHP
PHP中使用GD库创建圆形饼图的例子
2014/11/19 PHP
PHP开发框架laravel安装与配置教程
2015/03/13 PHP
php生成复杂验证码(倾斜,正弦干扰线,黏贴,旋转)
2018/03/12 PHP
PHP实现数据库的增删查改功能及完整代码
2018/04/18 PHP
不错的asp中显示新闻的功能
2006/10/13 Javascript
两种方法实现文本框输入内容提示消失
2013/03/17 Javascript
使用JavaScript 实现对象 匀速/变速运动的方法
2013/05/08 Javascript
js和jquery中循环的退出和继续下一个循环
2014/09/03 Javascript
jQuery实现返回顶部效果的方法
2015/05/29 Javascript
AngularJS 与Bootstrap实现表格分页实例代码
2016/10/14 Javascript
JavaScript 函数节流详解及方法总结
2017/02/09 Javascript
JS非空验证及邮箱验证的实例
2017/08/11 Javascript
vue中的自定义分页插件组件的示例
2018/08/18 Javascript
node.js微信小程序配置消息推送的实现
2019/02/13 Javascript
小程序实现分类页
2019/07/12 Javascript
Node.js 在本地生成日志文件的方法
2020/02/07 Javascript
Javascript查看大图功能代码实现
2020/05/07 Javascript
vue在App.vue文件中监听路由变化刷新页面操作
2020/08/14 Javascript
vue+swiper实现左右滑动的测试题功能
2020/10/30 Javascript
[01:04:14]VP vs TNC 2018国际邀请赛小组赛BO2 第二场 8.17
2018/08/20 DOTA
在Linux命令行终端中使用python的简单方法(推荐)
2017/01/23 Python
python中ASCII码字符与int之间的转换方法
2018/07/09 Python
TensorFlow 合并/连接数组的方法
2018/07/27 Python
Python-ElasticSearch搜索查询的讲解
2019/02/25 Python
django将网络中的图片,保存成model中的ImageField的实例
2019/08/07 Python
Python 通过正则表达式快速获取电影的下载地址
2020/08/17 Python
如何在scrapy中捕获并处理各种异常
2020/09/28 Python
在HTML5中如何使用CSS建立不可选的文字
2014/10/17 HTML / CSS
lululemon美国官网:瑜伽服+跑步装备
2018/11/16 全球购物
某集团股份有限公司委托书样本
2014/09/24 职场文书
离职报告格式
2014/11/04 职场文书
护士先进个人总结
2015/02/13 职场文书
女人创业励志语录,句句蕴含能量,激发你的潜能
2019/08/20 职场文书
MyBatis 动态SQL全面详解
2021/10/05 MySQL
MySQL提升大量数据查询效率的优化神器
2022/07/07 MySQL