目录
前言
仓库代码
开发环境
开发步骤
一、读取图片
二、图片灰度转换
三、修改图片尺寸
四、画图(人脸识别框)
五、图片中的人脸检测(可检测多张脸)
六、视频中的人脸检测(可检测多张脸)
视频人脸检测最后的成品代码以及详细注释:
视频示例展示:
人脸识别,是基于人的脸部特征信息进行身份识别的一种生物识别技术。 用摄像机或摄像头采集含有人脸的图像或视频流,并自动在图像中检测和跟踪人脸,进而对检测到的人脸进行脸部识别的一系列相关技术,通常也叫做人像识别、面部识别。
今天我们就来用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
视频示例展示:
智能人脸识项目最后成果