赞
踩
目录
人脸识别,是基于人的脸部特征信息进行身份识别的一种生物识别技术。 用摄像机或摄像头采集含有人脸的图像或视频流,并自动在图像中检测和跟踪人脸,进而对检测到的人脸进行脸部识别的一系列相关技术,通常也叫做人像识别、面部识别。
今天我们就来用Python实现一个简单的人脸识别项目~
博主宝贵的仓库连接就在下面了
推荐:Gitee Python自制项目
Python自制项目: From my homemade project (gitee.com)
一、PyCharm
二、OpenCv-Python
OpenCv的基本操作就是显示图像,先通过imread函数来读取图片,然后再显示图片、inshow()函数就是用来显示图像的;inshow()函数有两个参数,自定义图像名称和要显示的图像对象(imread函数的返回值),直接调用inshow()函数确实可以显示图片,但图片只是一闪而过,想要图片在屏幕上持久保留,就要通过waitKey()函数;waitKey()函数只有一个参数,等待键盘触发的时间,单位是毫秒,如果没有键被按下,就会返回-1这个值,最后由于底层是C++开发的,所有需要释放内存
代码即详细注释如下:
- #导入模块,顺便起个别名叫做cv
- import cv2 as cv
- #读取图片,这里写的是相对路径,在这个包下可以找到,也可以写绝对路径,但要注意不能有中文
- ret = cv.imread("jaychou.jpg")
- #显示图片
- cv.imshow("read", ret)
- #等待键盘输入,单位是毫秒,输入1000就是1秒,输入0就是无限等待,按任意键即停止
- cv.waitKey(0)
- #释放内存 因为OpenCv底层是C++写的
- cv.destroyAllWindows()
执行效果如下:
OpenCv中有数百种关于不同颜色之间的转换,计算机视觉中有三种常用色彩空间:灰度(去除颜色信息转化成灰阶)、BGR(彩色图片,蓝绿红色彩空间)、以及HSV(色调);
为什么要灰度转换?转化成灰度的图片计算强度得以降低,灰度色彩空间对人脸识别处理特别有效;通过调用cvtColor函数即可转化,有两个参数,图片本身和颜色常量,返回值为修改好的图像本身 ;
转化后用imwrite()保存图片,两个参数,自定义保存图片的名字和要保存的图片对象,这样这个图片就可以保存在同一包下;
代码即详细注释如下:
- import cv2 as cv
- ret = cv.imread("jaychou.jpg")
- cv.imshow("read", ret)
-
- #将图片进行灰度转化,COLOR_BGR2GRAY为灰度常量
- gray_ret = cv.cvtColor(ret, cv.COLOR_BGR2GRAY)
- #展示灰度图片
- cv.imshow("gray", gray_ret)
- #保存图片,在同一包下,生成灰度图片
- cv.imwrite("gray_jaychou", gray_ret)
-
- cv.waitKey(0)
- cv.destroyAllWindows()
执行效果如下:
有时候展示的图片不是我们想要的尺寸,这个时候就需要对图片的尺寸进行修改,同样,OpenCv给出了修改尺寸的函数resize(),函数有两个参数,图片对象和dsize=(),这第二个参数的括号内就是要设置的图片的大小(宽度和高度),返回值为修改好的图片对象
代码即详细注释如下:
- import cv2 as cv
- ret = cv.imread("jaychou.jpg")
- #修改尺寸
- resize_ret = cv.resize(ret, dsize=(200, 240))
- cv.imshow("ret", resize_ret)
- #输入指定键退出图片 waitKey(0)等待你输入键后,会返回你输入的ascii码
- while True:
- if ord("q") == cv.waitKey(0):
- break
- cv.destroyAllWindows()
执行效果如下(根据自己想要的大小去修改):
OpenCv的强大之处就在于可以对图片进行任意的编辑,处理;因为人脸识别需要检测人脸,所以就要把这个人脸圈起来,也就是绘制矩形或圆形,通过rectangle函数就可以绘制矩形,函数具有四个参数,图片对象、图像坐标(左上角坐标与右下角坐标),颜色通道,矩形线条宽度,通过这个函数绘制出一个矩形,圈出人脸;circle()函数用来绘制圆,和参数和矩形大致一样,第二个和第三个参数要注意是圆心的坐标和半径
代码即详细注释如下(矩形):
- import cv2 as cv
- ret = cv.imread("jaychou.jpg")
- #左上角的坐标是(x,y),矩形的宽度和高度为w,h
- x, y, w, h = 100, 100, 100, 100
- #绘制矩形,color=(0, 255, 0)这里代表圈起来的是绿色,thickness=2表示线条的宽度
- cv.rectangle(ret, (x, y), (x + w, y + h), color=(0, 255, 0), thickness=2)
- #显示图片
- cv.imshow("rectangle_ret", ret)
- cv.waitKey(0)
- cv.destroyAllWindows()
代码即详细注释如下(圆):
- import cv2 as cv
- ret = cv.imread("jaychou.jpg")
- # #左上角的坐标是(x,y),矩形的宽度和高度为w,h
- # x, y, w, h = 100, 100, 100, 100
- # #绘制矩形,color=(0, 255, 0)这里代表圈起来的是绿色,thickness=2表示线条的宽度
- # cv.rectangle(ret, (x, y, x + w, y + h), color=(0, 255, 0), thickness=2)
-
- #绘制圆,r为半径,(x,y)为圆心坐标
- x, y, r = 200, 200, 100
- #center是圆心坐标,radius是半径大小
- cv.circle(ret, center=(x, y), radius=r, color=(0, 0, 255), thickness=2)
- #显示图片
- cv.imshow("rectangle_ret", ret)
- cv.waitKey(0)
- cv.destroyAllWindows()
执行效果如下(还未进行人脸识别,所以不会框住人脸):
如何做到人脸检测?就是要获取人脸特征,并且实现人脸跟踪,这就需要用到第三方库了,通过OpenCv官网:Home - OpenCV 上下载OpenCv,选择你当前主机的版本即可,这里就不多说了,详细的解释都在注释里面
代码即详细注释如下:
- import cv2 as cv
- def face_check():
- # 灰度图片
- gray = cv.cvtColor(ret, cv.COLOR_BGR2GRAY)
- #加载特征数据,来自opencv中一个默认的扫描机制
- face_detector = cv.CascadeClassifier("D:/OpenCV/opencv/opencv/data/haarcascades/haarcascade_frontalface_alt2.xml")
- #检测
- faces = face_detector.detectMultiScale(gray)
- #针对人脸划分区域
- for x,y,w,h in faces:
- cv.rectangle(ret, (x, y), (x + w, y + h), color=(0, 255, 0), thickness=2)
- #检测完后进行显示
- cv.imshow("result", ret)
-
- #加载图片
- ret = cv.imread("jaychou.jpg")
- #检测人脸
- face_check()
- cv.waitKey(0)
- cv.destroyAllWindows()
执行效果如下:
视频实际上就是由多个照片一直播放形成的,所以想要检测视频中的人脸,就要对视频中的每一帧进行人脸检测OpenCv中给出了一个函数VideoCapture()用来存储视频,返回视频对象,通过调用read()函数即可以获取视频的每一帧,最后在结合之前所用到的一系列操作即可~
视频人脸检测最后的成品代码以及详细注释:
- import cv2 as cv
-
- def face_check(ret):
- # 灰度图片
- gray = cv.cvtColor(ret, cv.COLOR_BGR2GRAY)
- #加载特征数据,来自opencv中一个默认的扫描机制
- face_detector = cv.CascadeClassifier("D:/OpenCV/opencv/opencv/data/haarcascades/haarcascade_frontalface_alt2.xml")
- #检测
- faces = face_detector.detectMultiScale(gray)
- #针对人脸划分区域
- for x,y,w,h in faces:
- cv.rectangle(ret, (x, y), (x + w, y + h), color=(0, 255, 0), thickness=2)
- #检测完后进行显示
- cv.imshow("result", ret)
-
- #读取视频
- cap = cv.VideoCapture("jaychou.mp4")
- #读取视频上的图片,用循环读取每一张图片
- while True:
- flag, frame = cap.read()
- #如果视频播放的末尾,就退出循环
- if not flag:
- break
- #如果视频没到末尾,就把每一张图片放入检测
- # 检测人脸
- face_check(frame)
- #如果输入"q",就退出视频,这里每10毫秒播放一张图片
- if ord("q") == cv.waitKey(10):
- break
-
- #后面两步都是释放内存空间
- cv.destroyAllWindows()
- cap.release
视频示例展示:
智能人脸识项目最后成果
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。