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,一经查实,立即删除!

相关文章

JAVA视频教程

http://www.icoolxue.com/album/show/38 因为需要对接接口,所以需要学服务器的语言,java,新的旅程开始转载于:https://www.cnblogs.com/chuangyiyuan/p/7118551.html

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

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

网络技术术语英汉对照

1. ADSL (Asymmetric Digital Subscriber Line) 非对称数字环路 2. ANSI (American National Standard Institute) 美国国家标准协会 3. APIPA (Automatic Private IP Addressing) 自动私有IP寻址 4. AppleTalk 由Apple公司推出的一种多层协议,一种可路由协议组 5. ARP (Addres…

利用photoshop制作gif图片

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

合同相似可逆等价矩阵的关系及性质_线性代数预习自学笔记-11:等价性与相似性...

上一篇:线性代数预习自学笔记-10:线性变换一、相似矩阵根据矩阵表示定理,我们知道任意向量空间上的任意线性变换都可以用一个相应的矩阵表示;但一个棘手的问题是,在应用这个定理时,我们不可避免地需要先知道…

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

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

我看windows mobile数据同步方案

距离上篇博客似乎又过了一段日子了,这段日子应该算是挣扎着过来的,从寻找同步错误的过程到使用新的解决方案,总共花了近3个星期,我想自己有必要总结下这次的经历。项目是使用C#VS2008开发的,客户端数据存储采用SQL SER…

php获取当前时间戳方法

简介 php获取时间是件很容易的事情,下面小编就过来简单的分享一下个人所学php的一些经验吧; 操作方法 1、获取当前时间方法date() 很简单,这就是获取时间的方法,格式为:date($format, $timestamp),format为格式、timestamp为时间戳…

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

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

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

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

允許Linux的snmp服務被查詢

一、Linux(RedHat)的配置打开默认的/etc/snmp/snmpd.conf文件,更改如下配置:1、查找以下字段:[Copy to clipboard] [ - ]CODE:# sec.name source communitycom2sec notConfigUser default public将"comunity&quo…

综合布线中所需要的的带宽和数据速率

术语带宽和数据速率通常可以互换使用,但如果您在布线领域工作,它们实际上是非常不同的。 您的internet提供商可能会公布每秒500兆比特(Mbps)的带宽。在这种情况下,它们实际上是指数据速率。在布线领域,带宽…

02数据结构与算法分析之---数据的两种结构

本系列是阅读《数据结构与算法应用实践教程》第2版 主编 李文书 北京大学出版社 的读书笔记,加上自己的理解,更多的是学习的记录与反思,如有不妥,欢迎指正,非常感谢。转载于:https://www.cnblogs.com/guochaoxxl/p/712…

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

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

4. 用MVC实现URL路由

用MVC实现URL路由原文:http://quickstarts.asp.net/3-5-extensions/mvc/MvcUrlRouting.aspx1. 介绍MVC框架使用URL路由将URL映射到控制器类及Action方法。URL路由自动解析URL中的变量,并将他们作为参数传递给Action方法。2. 默认路由MVC提供了一些默认UR…

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

极性定义了流动的方向,例如磁场或电流的方向。在光纤中,极性是定向的;光信号通过光缆从一端传输到另一端。光缆一端的光纤链路传输信号(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格式,可在文后点击“附件下载”阅读全文。本篇内容简介及部分截图:◇ 为什么需要愿景◇ 业务愿景◇ 系统愿景◇ 导出愿景的技巧◇ 小结