python人脸照片分类_Python OpenCV 人脸识别(一)

       前面介绍了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>>>

f89f4384f1b8772a6927fb1230d56d4e.png

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)>>>

d6aeb1ccd0de71e0d6ce4dd8448dc2a8.png

cat3 = cat_data[::5, ::5]  # 间隔改为5,将图片缩小Image.fromarray(cat3)>>>

b8fa4361e810723ee23560905298be37.png

import matplotlib.pyplot as plt%matplotlib inlineplt.imshow(cat_data[::15,::15]) # 将图片变成马赛克>>>

a4469934589474f141519a522bc8a7f1.png

cat6 = cat_data[:,:800]  # 截取图片的一部分plt.imshow(cat6)>>>

caf731f5561327d6cf4c373fffbc8b37.png

cat7 = cat_data[:,800:,::-1]   # 截取图片的一部分,并更改颜色plt.imshow(cat7)>>>

5b82c718b1cffb069c6b557e6e0d0a72.png

# 两者拼接成一个新的图片cat8 = np.concatenate((cat6,cat7),axis=1)plt.imshow(cat8)>>>

1d50d3f1aa2372998c5be0b192bc431a.png

三、OpenCV人脸识别

找一张我大兄弟的照片,识别出他的脸:

87d52cac8767a99fe6606c9e05848aac.png

先介绍一下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键结束

20f352b46b6f70311192952b0de84d0f.png

# 把图片变成黑白# BGR代表蓝绿红,颜色通道是BGR,区别于PIL读取图片的RGB通道wu2 = cv2.cvtColor(wu1,code=cv2.COLOR_BGR2GRAY)cv2.imshow('wu1',wu2)cv2.waitKey(5000) # 停留5scv2.destroyAllWindows()>>> # 弹出如下的照片

4b977378fc2d432a303cdca3f5e5dbed.png

# 调整照片的尺寸wu3 = cv2.resize(wu1,dsize=(150,150))cv2.imshow('wu1',wu3)cv2.waitKey(5000) # 停留5scv2.destroyAllWindows()

d86bccb1d75ab4111a6cb16f995ab274.png

# 保存图片,成功返回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()>>> 如下所示,识别出了帅气的脸

cfb4eab756999caee88cbdd6565045ba.png

示例2:

对于照片中的多张人脸识别

868f74b38da9b1c80b4ef496e60aa96a.png

# 多张人脸识别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()>>> 如下所示,四张人脸均被识别出来了

e9d31ab6decb100ab0ae0bb3f1cf1767.png

detectMultiScale中涉及到的几个重要参数:

imageCV_8U类型的矩阵,其中包含在其中检测到对象的图像。
objects矩形向量,其中每个矩形都包含检测到的对象,这些矩形可能部分位于原始图像的外部。
numDetections相应对象的检测编号向量。对象的检测次数是连接在一起以形成对象的相邻的正面分类矩形的数目。
scaleFactor该参数指定每个图像比例缩小多少图像尺寸。
minNeighbors该参数指定每个候选矩形必须保留多少个邻居。
flags与旧级联的含义相同的参数,与函数cvHaarDetectObjects中的含义相同。它不用于新的级联。
minSize最小可能的对象大小。小于此值的对象将被忽略。
maxSize最大可能的对象大小。大于此值的对象将被忽略。如果maxSize == minSize模型以单一比例评估。
示例3:

识别NBA全明星的脸

417cf3ba4b66f78291b397a9b040572c.png

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()>>>结果如下

3a75d0ed21276a190ddcbd369de30048.png

      识别出了11个人,有一个人识别不出来,还有一处地方识别错误,识别成功率比较高。需要调整相应的参数来调整。

      以上就是对于静态图片的人脸识别,当然了前面还有对眼睛瞪的识别,可以多加尝试。后面的话将介绍如何识别出视频中的人脸,以及自己在摄像头的人脸,并可以用其他图片来代替自己的脸。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/269016.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

万兆以太网测试仪应该具备什么功能

在以太网技术中,100BaseT是一个里程碑,确立了以太网技术在商业用途的统治地位。千兆以太网以及随后出现的万兆以太网标准是两个比较重要的标准,以太网技术通过这两个标准从商业用途的局域网技术延伸到校园网以及城域网的汇聚和骨干。 以太网…

利用photoshop制作gif图片

首先准备你需要的几张素材图片 1.将素材图片根据发生的顺序放置在不同的图层 2.打开窗口下的时间轴 选择帧动画 3.创建第一张帧动画 选项卡右边这个按钮,点击这个选择新建帧 第一张图片显示其他的隐藏 就是图层那儿左边的眼睛 4.创建第二章帧 新建帧--点击第二个图层…

光纤铜缆测试安装的基础知识你都了解了吗?

福禄克经销商—明辰智航走访了多名读者,发现他们都说自己精通测试系统设计、安装和测试,但是很多行业的新标准新要求却是很懵懂。所以,了解当前较新的性能参数,系统必须满足的各种标准和要求以支持新的应用,确保为客户…

不禁网页的浏览器_网页游戏兴衰史:「农场」没有菜,「渣渣辉」不贪玩

本文经授权转载自 | 国家人文历史ID |gjrwls作者 |巴里安200X年某月某日凌晨2点50,小明悄悄打开房门,蹑手蹑脚地走进存放笔记本电脑的房间,将拔下电源的电脑抱紧在怀里,悄悄地回了房间。一进房,小明兴奋地打开电脑&…

Java策略模式demo(打折策略例子)

策略模式:它定义了算法家族,分别封装起来,让它们之间可以相互替换。此模式让算法的改变,不会影响到使用算法的客户端。 它对一系列的算法进行封装,为所有的算法定义一个抽象的接口,并通过继承该抽象算法接…

java 多态判断非空_收藏Java 面试题全梳理

脚本之家你与百万开发者在一起来源 | Java建设者(ID:javajianshe)作者 |cxuan如若转载请联系原公众号Java 基础篇Java 有哪些特点并发性的:你可以在其中执行许多语句,而不必一次执行它面向对象的:基于类和面向对象的编程语言。独立…

福禄克官方经销商给您科普光纤极性基础

极性定义了流动的方向,例如磁场或电流的方向。在光纤中,极性是定向的;光信号通过光缆从一端传输到另一端。光缆一端的光纤链路传输信号(Tx)必须与另一端的相应接收器(Rx)匹配。那么,…

django Form组件

django Form组件 Django的Form主要具有一下几大功能: 生成HTML标签验证用户数据(显示错误信息)HTML Form提交保留上次提交数据初始化页面显示内容小试牛刀 1、创建Form类 from django.forms import Form from django.forms import widgets #…

RUP大讲堂(第三讲):如何建立软件产品的愿景

我撰写的一些关于RUP的讲义,PDF格式,可在文后点击“附件下载”阅读全文。本篇内容简介及部分截图:◇ 为什么需要愿景◇ 业务愿景◇ 系统愿景◇ 导出愿景的技巧◇ 小结

光纤测试时不得不用的福禄克CFP光纤测试仪

不同的光纤应用具有不同的最大插入损耗要求,以确保损耗不会过高,从而防止信号正确到达远端。因此,第一项任务涉及确定系统上线时客户计划运行的光纤应用程序,以及他们将来计划运行的光纤应用程序。 假设您的客户正在设计一个数据…

java怎么表示正无穷大_有什么比无穷大更大,比无穷小更小?

你好,欢迎来到我的《数学通识50讲》。我们讲无穷大是比任何数都大,那么世界上只有一个无穷大吗?如果有多个,能比较大小吗?类似的,无穷小就是无限接近于零,那么世界上会有不同的无穷小么&#xf…

越用越快的福禄克布线认证测试仪

对一些人来说,福禄克网络推出的布线认证测试仪系列仿佛就在昨天,特别是那些仍然坚持使用已经停产的福禄克DTX系列测试仪的用户。 但信不信由你,现在是包括DSX系列的测试仪在内的VersionV测试仪和光纤测试仪Pro和CFP光纤测试仪专业认证测试人员…

日照油库系统推荐_战“疫”快报(3.21)| 油库三期工程罐基础混凝土浇筑全部完成...

“3月20日,油库三期工程罐基础混凝土浇筑施工全部完成,为确保油库三期工程整体工期奠定了坚实基础。”“海通公司“日照—韩国平泽”航线恢复每周三班运营。海通公司在持续抓好疫情防控同时,保障腹地企业复工复产,精心组织航线运行…

vm+ubuntu联网

在vm下刚装了ubuntu,就是上不了网,确认以下配置后方可以 1、我的电脑开机自动把VM的相关服务都关闭了,需要手动打开 在控制面板中搜索服务,手动启动vm服务 2、在适配器里启用vm网卡 3、使用桥接模式 转载于:https://www.cnblogs.c…

网络布线工程师科普铜缆光纤损耗那点事!

(1)插入损耗 什么是插入损耗? 插入损耗是信号沿电缆链路传输时损失的能量量。对于任何类型的传输,无论是电力传输还是数据传输,这都是一种自然现象。这种信号的减少,也称为衰减,与电缆长度直接…

一个本地分支能关联两个远程仓库吗_使用git分支保存hexo博客源码到github

hexo是当前最火的静态博客框架,支持Markdown格式文章编辑并自动生成对应的静态网页,简单高效令人爱不释手。使用hexo写博客的流程通常是,通过hexo new post_name命令,会自动在source/_post目录下生成一个待写的post_name.md文件编…