本文正在参与 人工智能创作者扶持计划

今日学习的是OpenCV进行相片人脸检测,一切的参阅博文、文献、视频、代码都会在文末附上链接或文件压缩包。

本文的目录如下: @TOC

一、OpenCV 简介

1.什么.OpenCV

OpenCV是一个根据BSD许可(开源)发行的跨平台计算机视觉库,拥有丰富的常用图画处理函数库,采用C/C++言语编写,能够运行在Linux/Windows/Mac等操作系统上,能够快速的实现一些图画处理和辨认的任务。此外,OpenCV还供给了Java、python、cuda等的使用接口、机器学习的根底算法调用,从而使得图画处理和图画剖析变得愈加易于上手,让开发人员更多的精力花在算法的规划上。

2.为什么使用OpenCV?

虽然 python 很强大,并且也有自己的图画处理库 PIL,但是相对于OpenCV 来讲,它仍是弱小许多。跟许多开源软件一样 OpenCV 也供给了完善的 python 接口,十分便于调用。它包含了超过 2500 个算法和函数,简直任何一个能想到的老练算法都能够通过调用 OpenCV 的函数来实现,超级方便。

二、Opencv 进行相片人脸检测

1、代码

# -*- coding: utf-8 -*-
import cv2 as cv
def face_detect_demo(img):
    img = cv.resize(img, dsize=(800, 800))
    gary = cv.cvtColor(img, cv.COLOR_BGR2GRAY)
    face_detect = cv.CascadeClassifier("./opencv/sources/data/haarcascades/haarcascade_frontalface_alt2.xml")#haarcascade_frontalface_default.xml")
    face = face_detect.detectMultiScale(gary, 1.004, 28, 6, (60, 60), (70, 70))
    for x, y, w, h in face:
        cv.rectangle(img, (x, y), (x + w, y + h), color=(0, 0, 225), thickness=4)
    cv.imshow("result", img)
    # img.save("result.jpg")  # 保存图片
    cv.imwrite(r"final_result.jpg", img)
img = cv.imread("photo.jpg")
face_detect_demo(img)  # 检测单个图片
while True:
    if ord("q") == cv.waitKey(1):
        break
cv.destroyAllWindows()

2、代码解说

detectMultiScale()函数 具体解说

1. import cv2 as cv

首要导入咱们所需求的必要包opencv,对应指令为import cv2 as cv,这儿的as就相当于给这个模块起了个别号。 假如opencv还没有装置的话,能够在终端里边pip install opencv-python。

2. def face_detect_demo(img):

接着,咱们界说一个函数face_detect_demo,这个函数有一个参数img,即咱们要检测的图片,这是一个形参。

3. img = cv.resize(img, dsize=(800, 800))

调用cv里边的函数resize,改变图片的巨细。 resize第一个参数是要处理的图片,第二个参数是你想要改成图片的巨细, 这儿的(800,800)便是改成800*800的这样一张图片。处理的成果再回来给img。

4. gary = cv.cvtColor(img, cv.COLOR_BGR2GRAY)

接下来更改图片色彩,直接调用cvtColor函数, 同样,第一个参数是要处理的图片,第二个参数是要更改的色彩类型, 这儿的色彩类型有许多种,我这儿设置的是COLOR_BGR2GRAY类型。

前几步,能够了解为将图片标准化,即传入不同巨细,不同色彩的图片能够转化成同一巨细,同一色彩类型的图片。这样的操作好处在于后边调参数更简单。

5. face_detect = cv.CascadeClassifier("./opencv/sources/data/haarcascades/haarcascade_frontalface_default.xml")

==重头戏来了!===,这是opencv官方现已训练好的一个人脸检测模型,直接调用就能够,十分方便! 文件链接:pan.baidu.com/s/1FV3NWT3V… 提取码:tsvd 文件和代码提取链接,也有一些其他训练好的模型,假如感兴趣的话你也能够试一试其他模型。

6. face = face_detect.detectMultiScale(gary, 1.004, 10, 0, (40, 40), (50, 50))

接着,咱们检测图片中的人脸,face_detect.detectMultiScale,便是调用模型里的detectMultiScale。

detectMultiScale(image[, scaleFactor[, minNeighbors[, flags[, minSize[, maxSize]]]]]) -> objects

第一个参数 image是要处理的图片,一般为灰度图画加速检测速度;

第二个参数 scaleFactor是表明在前后两次相继的扫描中,查找窗口的份额系数。默以为1.1即每次查找窗口依次扩大10%;份额越小,迭代的次数越多。 Haar cascade的工作原理是一种“滑动窗口”的办法,通过在图画中不断的“滑动检测窗口”来匹配人脸。 因为图画的像素有大有小,图画中的人脸因为远近不同也会有大有小,所以需求通过scaleFactor参数设置一个缩小的份额,对图画进行逐步缩小来检测,这个参数设置的越大,计算速度越快,但可能会错过了某个巨细的人脸。 其实能够依据图画的像素值来设置此参数,像素大缩小的速度就能够快一点,通常在1~1.5之间。 那么,通过屡次的迭代,实际会检测出许多许多个人脸,这一点能够通过把minNeighbors 设为0来验证。

第三个参数 minNeighbors–表明构成检测方针的相邻矩形的最小个数(默以为3个)。假如组成检测方针的小矩形的个数和小于 min_neighbors – 1 都会被扫除。假如min_neighbors 为 0, 则函数不做任何操作就回来一切的被检候选矩形框。 这儿有点不太好了解,相邻矩形指的是对于同一张候选人脸(没有确定)屡次迭代后辨认到的框,只要这个相邻框的个数大于自己设定的minneighbor,才会确定这个候选人脸框是正确的。 下面举例说明: minNeighbors=0能够了解为每个人像只要被辨认到一次就能够,因为一次对应一个方框。比方,参阅博文中的这些图人脸检测,下图最右上角李斯被辨认出1次,这个方框街坊数为0。

【使用OpenCV进行照片人脸检测】------机器学习(附完整代码和数据集)

但假如minNeighbors=1,至少有一个街坊方框,那就意味着被辨认出来至少两次。下图李斯没辨认出来,因为她的辨认成果中没有“街坊”;

【使用OpenCV进行照片人脸检测】------机器学习(附完整代码和数据集)

minNeighbors=3,至少有3个街坊方框,那就意味着被辨认出来至少4次。下图孟佳也没有辨认出来,因为她的辨认成果中只要1个“街坊”。

【使用OpenCV进行照片人脸检测】------机器学习(附完整代码和数据集)

第四个参数 flag参数与旧的级联办法cvHaarDetectObjects中一样,新的级联中不必。(没用到这个参数)取恣意值都可。但不能直接删掉。会报错。

error: OpenCV(4.7.0) :-1: error: (-5:Bad argument) in function 'detectMultiScale'
> Overload resolution failed:
>  - Argument 'flags' is required to be an integer
>  - Argument 'flags' is required to be an integer

第五个参数 minSize是最小矩形框巨细,

第六个参数 maxSize是最大矩形框巨细。这六个参数需求自己去调,以求最佳匹配。 detectMultiScale办法会直接用该模型检测图片,并回来多个x,y,w,h。(x,y)是左顶点的坐标,w是矩形框的宽度,h是矩形框的高度。

7. for x, y, w, h in face:
    cv.rectangle(img, (x, y), (x + w, y + h), color=(0, 0, 225), thickness=4)
   cv.imshow("result", img)
   cv.imwrite(r"final_result.jpg", img)

for循环的功用便是在原来的图片上面制作矩形框啦,对应的函数是cv.rectangle,这儿面的参数很简单就不一一介绍了。 cv.imshow进行展现,cv.imwrite进行保存,注意imwrite保存图片时,命名要加上.jpg

==函数到此结束,接下来是调用函数:==

8. img = cv.imread("photo.jpg")
   face_detect_demo(img)  # 检测单个图片

首要读取图片,把程序和图片放在一个文件夹,能够直接用名字去读,假如你没有放在一个文件家里边,要用绝对路径去读取。 调用上面写好的函数去查验人脸。

9. while True:
       if ord("q") == cv.waitKey(1):
           break
   cv.destroyAllWindows()

最终做一个键盘的相关事件退出,,按下键盘q键会退出循环,程序结束。cv.destroyAllWindows销毁一切窗口。

3、效果剖析

找了前几天微博之夜的图片,正面临镜头根本都能精确检测到人脸的位置。

【使用OpenCV进行照片人脸检测】------机器学习(附完整代码和数据集)

但侧面临镜头未能精确检测到,那可是神仙姐姐啊!!! 有大神知道怎样调参数欢迎评论区指导!!!!

我这儿用的是: face = face_detect.detectMultiScale(gary, 1.029, 3, 6, (90, 90), (120, 120))

【使用OpenCV进行照片人脸检测】------机器学习(附完整代码和数据集)

参阅博客及代码

detectMultiScale参数

根据opencv的人脸检测(图片、视频、摄像头)

根据opencv的人脸检测

opencv 官方开源代码链接:pan.baidu.com/s/1FV3NWT3V…
提取码:tsvd

最终,感谢各位长辈的共享,本文先写到这儿,欢迎大家批评指正!