使用Python+OpenCV+Dlib实现人脸检测与人脸特征关键点识别

磐创AI

    
    今天,我们将学习如何检测图像中的人脸并提取面部特征,如眼睛、鼻子、嘴巴等。我们可以将这些信息作为一个预处理步骤来完成,例如捕捉照片中人物的人脸(手动或通过机器学习),创建效果来“增强”我们的图像(类似于Snapchat等应用程序中的效果),对人脸进行情感分析等等。今天我们将通过引入DLib和从图像中提取面部特征来将其提升到一个新的水平。相关阅读:https://towardsdatascience.com/essential-opencv-functions-to-get-you-started-into-computer-vision-743df932e60Dlib是一个高级的机器学习库,它是为解决复杂的现实世界问题而创建的。这个库是用C++编程语言创建的,它与C/C++、Python和java一起工作。Dlib:http://dlib.net/值得注意的是,本教程可能需要对OpenCV库有一定的了解,例如如何处理图像、打开相机、图像处理和一些小技巧。它是如何工作的?我们的脸有几个可以识别的特征,比如眼睛、嘴巴、鼻子等等。当我们使用DLib算法检测这些特征时,我们实际上得到了每个特征点的映射。该映射由67个点(称为地标点)组成,可识别以下特征:
    
    颚点= 0–16右眉点= 17–21左眉点= 22–26鼻点= 27–35右眼点= 36–41左眼点= 42–47口角= 48–60嘴唇分数= 61–67现在让我们来了解如何提取特征。安装要求与往常一样,本文将用代码演示示例,并将逐步指导你实现一个完整的人脸特征识别示例。但是在开始之前,你需要启动一个新的Python项目并安装3个不同的库:opencv pythondlib如果像我一样使用pipenv,可以使用以下命令安装所有这些文件:pipenv install opencv-python, dlib如果你使用的是Mac和某些版本的Linux,则在安装dlib时可能会遇到一些问题,如果遇到的是编译错误,请检查使用的CMake库版本。在Mac中,确保你有可用的CMake,并且使用正确的版本运行:brew install cmake对于其他操作系统,请在线检查以获得特定支持。步骤1:载入并显示图片我们将从小处着手并以代码为基础,直到有一个可以正常工作的示例为止。通常,我喜欢使用绘图来渲染图像,但是由于我们在之后的文章中准备了一些很酷的东西,因此我们将做一些不同的事情,并且将创建一个窗口来展示我们的工作结果。让我们一起看看代码吧!import cv2# read the imageimg = cv2.imread("face.jpg")# show the imagecv2.imshow(winname="Face", mat=img)# Wait for a key press to exitcv2.waitKey(delay=0)# Close all windowscv2.destroyAllWindows()很简单,对吧?我们只是用imread加载图像,然后告诉OpenCV在winname中显示图像,这将打开窗口并给它一个标题。之后,我们需要暂停执行,因为当脚本停止时,窗口会被破坏,所以我们使用cv2.waitKey来保持窗口,直到按下某个键,然后销毁窗口并退出脚本。如果使用代码并在代码目录中添加了一个名为face.jpg的图像,你应该得到如下内容:原始图像:
    
    步骤2:人脸识别到目前为止,我们还没有对图像做任何处理,只是把它呈现在一个窗口中,这是非常无聊的,但是现在我们将开始加入其它的内容,我们将从识别图像中选择一张脸开始。为此,我们将使用名为get_frontial_face_detector()的Dlib函数,非常直观,但是有一个警告提示这个函数只适用于灰度图像,所以我们必须首先使用OpenCV。get_frontial_face_detector()会返回一个检测器,该检测器是一个我们可以用来检索人脸信息的函数,每个面都是一个对象,其中包含可以找到图像的位置点。但我们最好在代码上看看:import cv2import dlib# Load the detectordetector = dlib.get_frontal_face_detector()# read the imageimg = cv2.imread("face.jpg")# Convert image into grayscalegray = cv2.cvtColor(src=img, code=cv2.COLOR_BGR2GRAY)# Use detector to find landmarksfaces = detector(gray)for face in faces:    x1 = face.left() # left point    y1 = face.top() # top point    x2 = face.right() # right point    y2 = face.bottom() # bottom point    # Draw a rectangle    cv2.rectangle(img=img, pt1=(x1, y1), pt2=(x2, y2), color=(0, 255, 0), thickness=4)# show the imagecv2.imshow(winname="Face", mat=img)# Wait for a key press to exitcv2.waitKey(delay=0)# Close all windowscv2.destroyAllWindows()上面的代码将从图像中检索所有面部,并在每个面部上渲染一个矩形,从而产生如下图像:
    
    
    
    1  2  3  下一页>