我是靠谱客的博主 粗暴小懒猪,最近开发中收集的这篇文章主要介绍人脸特征点检测(二),觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

2.Dlib人脸特征点检测

Dlib库是一个集机器学习、计算机视觉、图像处理等众多算法的开源库,其代码简洁,注释清晰,支持C++和Python接口,库中很多头文件可以直接放在C++应用中。Dlib实现了2014年一篇非常经典的人脸特征点检测的论文:Face Alignment at 3000 FPS via Regression Local Binary Features,其人脸特征点检测又快又准。

这里写图片描述

这里不探讨dlib库的编译问题,请自行编译。使用Dlib库进行人脸特征点检测十分简单,可以参考官网的examples,下面是画出人脸特征点的python脚本和效果图。

# coding: utf-8
import cv2
import dlib
#draw_all_landmarks_id
detector = dlib.get_frontal_face_detector()
#predictor = dlib.shape_predictor('/home/tanhui/notebook/shape_predictor_68_face_landmarks.dat')
predictor = dlib.shape_predictor('shape_predictor_68_face_landmarks.dat')

img = cv2.imread('test.jpg')
img_out = img.copy()
dets = detector(img,0) #dlib人脸检测
print dets[0]
for i,d in enumerate(dets):
    cv2.rectangle(img_out,(d.left(),d.top()),(d.right(),d.bottom()),(0,255,0),3)
    shape = predictor(img,d) #dlib人脸特征点检测
    for k in range(0,68): #68个特征点
        cv2.circle(img_out,(shape.part(k).x,shape.part(k).y),2,(255,0,0),-1) #-1表示填充
        #cv2.putText(img_out,'%d' % k,(shape.part(k).x,shape.part(k).y),cv2.FONT_HERSHEY_SIMPLEX,0.4,(0,0,255),1) #标记点号
        print (shape.part(k).x,shape.part(k).y)
cv2.imwrite('face_landmarks.jpg',img_out)
print 'success'

cv2.imshow('landmarks',img_out)
cv2.waitKey(0)
cv2.destroyAllWindows()

这里写图片描述
这里写图片描述

下面是用opencv调用摄像头、Dlib进行摄像头视频实时检测人脸和特征点python脚本。摄像头分辨率为640x480,在我的机器上(i7 6700K CPU @ 4.00GHz)测试人脸检测平均耗时44ms,人脸特征点检测平均耗时3ms。如果摄像头中人脸总是比较大(离镜头比较近),完全可以对图像下采样之后进行人脸检测,速度会提升很多,例如下采样一倍时,人脸检测平均耗时降低到11ms,因此在某些场景下达到实时检测也是完全可以的。

# -*- coding: utf-8 -*-
"""
Created on Thu Apr 06 20:52:04 2017

@author: Administrator
"""
import dlib
import cv2
import time

detector = dlib.get_frontal_face_detector()
predictor = dlib.shape_predictor('shape_predictor_68_face_landmarks.dat')

def find_face_landmarks(img):
    time0 = time.time()
    points = []
    rects = detector(img,0)
    time1 = time.time()
    print (time1 - time0)*1000,'ms'
    if len(rects) == 0:
        return [],points

    shape = predictor(img,rects[0])
    time2 = time.time()
    print (time2 - time1)*1000,'ms'
    for i in range(0,68):
        points.append((shape.part(i).x,shape.part(i).y))

    return rects[0],points

最后

以上就是粗暴小懒猪为你收集整理的人脸特征点检测(二)的全部内容,希望文章能够帮你解决人脸特征点检测(二)所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(40)

评论列表共有 0 条评论

立即
投稿
返回
顶部