python图像处理入门(三)

自从上次可以读取出图片并显示出来,甚至还可以通过调用convert函数对读取出来的图像进行一定的灰度变化,总想着是不是要更进一步呢,那么下一步做什么比较好呀。就想到了人脸识别,由于这部分自学,也没找到什么比较好的书或者视频,就自己找找博客看看,但是人脸识别这么难,我刚接触图像处理,该怎么做呢?正巧今天中午看到某公众号发出来一篇文章,大意就是可以有比较好的工具帮助进行人脸识别,那不就好办了嘛。在这个基础上查了几篇博客,在这里把涉及到的方法和工具使用记录一下

一、识别器

接触过这方面相关知识的应该知道,我们如果要进行人脸识别应该需要建立一个模型,然后还需要一定的模型去训练它,使得 这个模型能对人脸的特征有一些“经验”,知道什么样的是人脸,然后在测试集中才会找到我们想要的识别效果。但是如果我们下载了与python相匹配的opencv,即opencv-python,那么在它的目录下面会有一个训练好的人脸识别器,我们这里使用了haarcascade_frontalface_default.xml,在一些博客上会写到需要在GitHub上下载这个工具,实际上如果安装好了opencv直接使用就可以了,具体可以搜索一下文件名再看一下它的路径。我这里使用的是anaconda下的opencv,所以其路径是在anaconda下的pkgs->libopencv-3.4.1-h875b8b8_3(这里的版本号可能根据每个人下载的不同而存在差异)->Library->etc->haarcascades,在这个路径下就可以找到我们的识别器了。

接下来我们需要声明一个变量,像这样:

f=cv2.CascadeClassifier("E:\\anaconda\\pkgs\\libopencv-3.4.1-h875b8b8_3\\Library\\etc\\haarcascades\\haarcascade_frontalface_default.xml")

需要注意的是路径要像这样使用双斜线,不然会报错

CascadeClassifier叫做级联分类器,大概理解了一下,我们在判定人脸属性的时候,有几种方法,比如左眼,右眼,鼻子,嘴巴,耳朵,等等,这种是基本的分类器来实现的,分类器对于一个事物的判断结果只有true/false两种,而级联分类器要做的事情是这样的,比如我们进行人脸识别,就把与人脸识别相关的分类器的结果集中起来,如果全部都判定为真那么则确认我们找到了一个人脸,否则认为没有。

二、detectMultiScale函数

这是一个用于检测的函数,其中有几个参数,是要手动设置的,使用的时候像这样:

gray = cv2.cvtColor(image,cv2.COLOR_BGR2GRAY)  #灰度转换
faces = f.detectMultiScale(         #探测人脸
    gray,
    scaleFactor = 1.15,
    minNeighbors = 5,
    minSize = (5,5),
    )

这里我们首先将图像进行了灰度转换,然后再对函数中几个参数依次说明:

第一个是需要检测的图像对象,这里就是我们转换为灰色图像的图片

第二个是每次图像尺寸减小的比例

第三个是表示每一个目标至少要被检测到3次才算是真的目标(因为周围的像素和不同的窗口大小都可以检测到人脸)

第四个是目标的最小尺寸

还可以包括几个参数:minSize,检测的最大尺寸

                                    Objects表示检测到的人脸序列,这个参数没大懂怎么用的,如果不写的话会有一个默认值

三、完整程序

import cv2
f=cv2.CascadeClassifier("E:\\anaconda\\pkgs\\libopencv-3.4.1-h875b8b8_3\\Library\\etc\\haarcascades\\haarcascade_frontalface_default.xml")
image = cv2.imread("E:\\360MoveData\\Users\\Administrator\\Desktop\\things2_0\\picSources\\doutinghao.jpg")           #读取图片
gray = cv2.cvtColor(image,cv2.COLOR_BGR2GRAY)  #灰度转换
faces = f.detectMultiScale(         #探测人脸
    gray,
    scaleFactor = 1.15,
    minNeighbors = 5,
    minSize = (5,5),
    )

for(x,y,w,h) in faces:
    cv2.rectangle(image,(x,y),(x+w,y+h),(0,0,255),2)
cv2.imshow("face recognizition",image)                #显示图像
cv2.waitKey(0)

四、效果

可以看到这里有两个人脸没有被识别到,具体可能要再调整一下参数

图片传上来有些变形,但识别效果很好

这篇博客参考了https://blog.csdn.net/weixin_42309501/article/details/80781293对于函数的介绍,在此感谢

猜你喜欢

转载自blog.csdn.net/LieberVater/article/details/88741098