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中os操作文件及文件路径实例汇总
Jan 15 Python
Python使用random和tertools模块解一些经典概率问题
Jan 28 Python
python检测远程udp端口是否打开的方法
Mar 14 Python
分享一下Python 开发者节省时间的10个方法
Oct 02 Python
python测试mysql写入性能完整实例
Jan 18 Python
python如何派生内置不可变类型并修改实例化行为
Mar 21 Python
对python numpy数组中冒号的使用方法详解
Apr 17 Python
python调用摄像头显示图像的实例
Aug 03 Python
浅谈python3.x pool.map()方法的实质
Jan 16 Python
python程序 创建多线程过程详解
Sep 23 Python
关于Pytorch MaxUnpool2d中size操作方式
Jan 03 Python
Python中的 No Module named ***问题及解决
Jul 23 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
迅雷下载《中学科技》怀旧期刊下载
2021/02/27 无线电
php中实现用数组妩媚地生成要执行的sql语句
2015/07/10 PHP
php搜索文件程序分享
2015/10/30 PHP
php脚本运行时的超时机制详解
2016/02/17 PHP
Django 标签筛选的实现代码(一对多、多对多)
2018/09/05 PHP
jquery validation插件表单验证的一个例子
2010/03/03 Javascript
使用JS 清空File控件的路径值
2013/07/08 Javascript
jquery.autocomplete修改实现键盘上下键自动填充示例
2013/11/19 Javascript
JS制作图形验证码实现代码
2020/10/19 Javascript
AngularJS模仿Form表单提交的实现代码
2016/12/08 Javascript
vue elementUI tree树形控件获取父节点ID的实例
2018/09/12 Javascript
JavaScript实现简单轮播图效果
2018/12/01 Javascript
跟老齐学Python之print详解
2014/09/28 Python
Python3实现将文件树中所有文件和子目录归档到tar压缩文件的方法
2015/05/22 Python
Django卸载之后重新安装的方法
2017/03/15 Python
Python PyQt4实现QQ抽屉效果
2018/04/20 Python
python pygame实现方向键控制小球
2019/05/17 Python
Python实现K折交叉验证法的方法步骤
2019/07/11 Python
python bluetooth蓝牙信息获取蓝牙设备类型的方法
2019/11/29 Python
使用keras根据层名称来初始化网络
2020/05/21 Python
3种方式实现瀑布流布局小结
2019/09/05 HTML / CSS
上海奥佳笔试题面试题
2016/11/16 面试题
linux面试题参考答案(9)
2016/01/29 面试题
最新的互联网创业计划书
2014/01/10 职场文书
《都江堰》教学反思
2014/02/07 职场文书
岗位职责风险防控
2014/02/18 职场文书
马丁路德金演讲稿
2014/05/19 职场文书
高中教师先进事迹材料
2014/08/22 职场文书
党员个人自我剖析材料
2014/10/08 职场文书
新郎结婚保证书
2015/02/26 职场文书
幼儿园老师新年寄语
2015/08/17 职场文书
科级干部培训心得体会
2016/01/06 职场文书
Golang 实现超大文件读取的两种方法
2021/04/27 Golang
世界十大评分最高的动漫,CLANNAD上榜,第八赚足人们眼泪
2022/03/18 日漫
python3 字符串str和bytes相互转换
2022/03/23 Python
铁拳制作人赞《铁拳7》老头环Mod:制作精良 但别弄了
2022/04/03 其他游戏