【Python】基于OpenCv的智能人脸识别,教你轻松拿下Python项目之首(附源码+仓库地址)

目录

 前言

仓库代码

开发环境

开发步骤

 一、读取图片

二、图片灰度转换

 三、修改图片尺寸

 四、画图(人脸识别框)

 五、图片中的人脸检测(可检测多张脸)

 六、视频中的人脸检测(可检测多张脸)

视频人脸检测最后的成品代码以及详细注释:

视频示例展示:


 前言

        人脸识别,是基于人的脸部特征信息进行身份识别的一种生物识别技术。 用摄像机或摄像头采集含有人脸的图像或视频流,并自动在图像中检测和跟踪人脸,进而对检测到的人脸进行脸部识别的一系列相关技术,通常也叫做人像识别、面部识别。

        今天我们就来用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

视频示例展示:

智能人脸识项目最后成果


 

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
THE END
分享
二维码
< <上一篇
下一篇>>