前面介绍了Numpy模块,下面再介绍一个OpenCV模块,就基于这两个库看一下当下很火的人工智能是如何实现的,我们介绍几个:人脸识别(当下非常火的)、音视频操作等等。今天先介绍一下静态图片的人脸识别,后面再介绍动态视频以及摄像头中的人脸识别。
一、OpenCV介绍OpenCV是一个基于BSD许可(开源)发行的跨平台计算机视觉库,可以运行在Linux、Windows、Android和MacOS操作系统上。它轻量级而且高效——由一系列 C 函数和少量 C++ 类构成,同时提供了Python、Ruby、MATLAB等语言的接口,实现了图像处理和计算机视觉方面的很多通用算法。
OpenCV-Python是OpenCV的PythonAPI,集成了Python语言和C++语言的最优特征,致力于支持Python解决计算机视觉问题。OpenCV在以下领域有着广泛的应用:
1、人机互动
2、物体识别
3、图像分割
4、人脸识别
5、动作识别
6、运动跟踪
7、机器
8、运动分析
9、机器视觉
10、结构分析
11、汽车安全驾驶
首先安装OpenCV模块,还是依赖于pip工具
在cmd命令中输入pip install opencv-python,安装完成之后,模块是以cv2的名字存在,可以通过importcv2来调用。
二、Numpy对图片的操作图片读入程序中后,是以numpy数组存在的。因此对numpy数组的一切功能,对图片也适用。对数组元素的访问,实际上就是对图片像素点的访问。
彩色图片访问方式为:img[i,j,c]。i表示图片的行数,j表示图片的列数,c表示图片的通道数(RGB三通道分别对应0,1,2)。坐标是从左上角开始。我们将使用此模块将Python列表转换为numpy数组,因为OpenCV人脸识别器接受numpy数组。
示例:
from PIL import Imagecat = Image.open(r'C:\Users\56331\Desktop\cat.jpg')cat>>>
cat_data = np.array(cat) cat_data.shape>>>(720, 1280, 3) # 该图片720行,1280列,3代表RGB(红、绿、蓝)三通道分别对应0,1,2
cat2 = cat_data[:,::-1,:] # 将列的方向翻转,改变图片方向Image.fromarray(cat2)>>>
cat3 = cat_data[::5, ::5] # 间隔改为5,将图片缩小Image.fromarray(cat3)>>>
import matplotlib.pyplot as plt%matplotlib inlineplt.imshow(cat_data[::15,::15]) # 将图片变成马赛克>>>
cat6 = cat_data[:,:800] # 截取图片的一部分plt.imshow(cat6)>>>
cat7 = cat_data[:,800:,::-1] # 截取图片的一部分,并更改颜色plt.imshow(cat7)>>>
# 两者拼接成一个新的图片cat8 = np.concatenate((cat6,cat7),axis=1)plt.imshow(cat8)>>>
三、OpenCV人脸识别找一张我大兄弟的照片,识别出他的脸:
先介绍一下OpenCv的常见操作
import numpy as npimport cv2# 读取照片wu1 = cv2.imread(r'C:\Users\56331\Desktop\me.jpg')wu1.shape # 查看照片尺寸>>>(300, 300, 3) # 该照片是300x300的
# 显示图片cv2.imshow('wu1',wu1)# 等待键盘输入,单位毫秒,如果是0,无限等待cv2.waitKey(0)cv2.destroyAllWindows()>>> # 弹出如下的照片,按q键结束
# 把图片变成黑白# BGR代表蓝绿红,颜色通道是BGR,区别于PIL读取图片的RGB通道wu2 = cv2.cvtColor(wu1,code=cv2.COLOR_BGR2GRAY)cv2.imshow('wu1',wu2)cv2.waitKey(5000) # 停留5scv2.destroyAllWindows()>>> # 弹出如下的照片
# 调整照片的尺寸wu3 = cv2.resize(wu1,dsize=(150,150))cv2.imshow('wu1',wu3)cv2.waitKey(5000) # 停留5scv2.destroyAllWindows()
# 保存图片,成功返回Truecv2.imwrite(r'C:\Users\56331\Desktop\me2.jpg',wu3)>>> True
下面开始进行人脸识别opencv的包中自带有人脸分类器,可以方便实现对人脸、人眼和微笑的检测,值得注意的是人脸分类器对于正脸有较好的提取,对于侧脸就需要其他的了。
示例1:人脸 - haarcascade_frontalface_default.xml
人眼 - haarcascade_eye.xml
微笑 - haarcascade_smile.xml
import numpy as npimport cv2# 读取图片wu = cv2.imread(r'C:\Users\56331\Desktop\me.jpg')# 人脸数据,级联分类器,给人脸特征数据,返回可以识别人脸的对象detector = cv2.CascadeClassifier(r'C:\ProgramData\Anaconda3\Lib\site-packages\cv2\data\haarcascade_frontalface_default.xml')
# 获取人脸区域face_zone = detector.detectMultiScale(wu)# 绘制人脸框for x,y,w,h in face_zone: cv2.rectangle(wu,pt1=(x,y),pt2=(x+w, y+h), color = [0,0,255])cv2.imshow('wu',wu)cv2.waitKey(5000) # 停留5scv2.destroyAllWindows()>>> 如下所示,识别出了帅气的脸
示例2:对于照片中的多张人脸识别
# 多张人脸识别import numpy as npimport cv2wu = cv2.imread(r'C:\Users\56331\Desktop\me2.jpg')detector = cv2.CascadeClassifier(r'C:\ProgramData\Anaconda3\Lib\site-packages\cv2\data\haarcascade_frontalface_default.xml')face_zone = detector.detectMultiScale(wu , scaleFactor=1.01 , minNeighbors=1 , minSize=(100,100) , maxSize=(150,150) )for x,y,w,h in face_zone: cv2.rectangle(wu,pt1=(x,y),pt2=(x+w, y+h), color = [0,0,255],thickness=2)cv2.imshow('wu3',wu)cv2.waitKey(5000) # 停留5scv2.destroyAllWindows()>>> 如下所示,四张人脸均被识别出来了
detectMultiScale中涉及到的几个重要参数:
image | CV_8U类型的矩阵,其中包含在其中检测到对象的图像。 |
objects | 矩形向量,其中每个矩形都包含检测到的对象,这些矩形可能部分位于原始图像的外部。 |
numDetections | 相应对象的检测编号向量。对象的检测次数是连接在一起以形成对象的相邻的正面分类矩形的数目。 |
scaleFactor | 该参数指定每个图像比例缩小多少图像尺寸。 |
minNeighbors | 该参数指定每个候选矩形必须保留多少个邻居。 |
flags | 与旧级联的含义相同的参数,与函数cvHaarDetectObjects中的含义相同。它不用于新的级联。 |
minSize | 最小可能的对象大小。小于此值的对象将被忽略。 |
maxSize | 最大可能的对象大小。大于此值的对象将被忽略。如果maxSize == minSize 模型以单一比例评估。 |
识别NBA全明星的脸
import numpy as npimport cv2photo = cv2.imread(r'C:\Users\56331\Desktop\NBA.jpg')detector = cv2.CascadeClassifier(r'C:\ProgramData\Anaconda3\Lib\site-packages\cv2\data\haarcascade_frontalface_default.xml')face_zone = detector.detectMultiScale(wu , scaleFactor=1.1 , minNeighbors=1 , minSize=(10,10) , maxSize=(30,30) )num = 0 # 统计人数for x,y,w,h in face_zone: num = num + 1 cv2.circle(photo, center = (x + w//2, y + h//2), radius = w//2, color = [0,255,0], thickness = 2) # 显示文字# cv2.putText(photo, str(num), (x,y), cv2.FONT_HERSHEY_COMPLEX, 1, (0, 255, 0), 1)# 总人数 cv2.putText(photo, "{}people".format(num), (10,50), cv2.FONT_HERSHEY_COMPLEX, 1, (142, 125, 52), 1)cv2.imshow('NBA',photo)cv2.waitKey(5000) # 停留5scv2.destroyAllWindows()>>>结果如下
识别出了11个人,有一个人识别不出来,还有一处地方识别错误,识别成功率比较高。需要调整相应的参数来调整。
以上就是对于静态图片的人脸识别,当然了前面还有对眼睛瞪的识别,可以多加尝试。后面的话将介绍如何识别出视频中的人脸,以及自己在摄像头的人脸,并可以用其他图片来代替自己的脸。