• 【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++开发的,所有需要释放内存

    代码即详细注释如下:

    1. #导入模块,顺便起个别名叫做cv
    2. import cv2 as cv
    3. #读取图片,这里写的是相对路径,在这个包下可以找到,也可以写绝对路径,但要注意不能有中文
    4. ret = cv.imread("jaychou.jpg")
    5. #显示图片
    6. cv.imshow("read", ret)
    7. #等待键盘输入,单位是毫秒,输入1000就是1秒,输入0就是无限等待,按任意键即停止
    8. cv.waitKey(0)
    9. #释放内存 因为OpenCv底层是C++写的
    10. cv.destroyAllWindows()

    执行效果如下:

    二、图片灰度转换

            OpenCv中有数百种关于不同颜色之间的转换,计算机视觉中有三种常用色彩空间:灰度(去除颜色信息转化成灰阶)、BGR(彩色图片,蓝绿红色彩空间)、以及HSV(色调);

            为什么要灰度转换?转化成灰度的图片计算强度得以降低,灰度色彩空间对人脸识别处理特别有效;通过调用cvtColor函数即可转化,有两个参数,图片本身和颜色常量,返回值为修改好的图像本身 ;

            转化后用imwrite()保存图片,两个参数,自定义保存图片的名字和要保存的图片对象,这样这个图片就可以保存在同一包下;

    代码即详细注释如下:

    1. import cv2 as cv
    2. ret = cv.imread("jaychou.jpg")
    3. cv.imshow("read", ret)
    4. #将图片进行灰度转化,COLOR_BGR2GRAY为灰度常量
    5. gray_ret = cv.cvtColor(ret, cv.COLOR_BGR2GRAY)
    6. #展示灰度图片
    7. cv.imshow("gray", gray_ret)
    8. #保存图片,在同一包下,生成灰度图片
    9. cv.imwrite("gray_jaychou", gray_ret)
    10. cv.waitKey(0)
    11. cv.destroyAllWindows()

    执行效果如下:

     三、修改图片尺寸

            有时候展示的图片不是我们想要的尺寸,这个时候就需要对图片的尺寸进行修改,同样,OpenCv给出了修改尺寸的函数resize(),函数有两个参数,图片对象和dsize=(),这第二个参数的括号内就是要设置的图片的大小(宽度和高度),返回值为修改好的图片对象

    代码即详细注释如下:

    1. import cv2 as cv
    2. ret = cv.imread("jaychou.jpg")
    3. #修改尺寸
    4. resize_ret = cv.resize(ret, dsize=(200, 240))
    5. cv.imshow("ret", resize_ret)
    6. #输入指定键退出图片 waitKey(0)等待你输入键后,会返回你输入的ascii码
    7. while True:
    8. if ord("q") == cv.waitKey(0):
    9. break
    10. cv.destroyAllWindows()

    执行效果如下(根据自己想要的大小去修改):

     四、画图(人脸识别框)

            OpenCv的强大之处就在于可以对图片进行任意的编辑,处理;因为人脸识别需要检测人脸,所以就要把这个人脸圈起来,也就是绘制矩形或圆形,通过rectangle函数就可以绘制矩形,函数具有四个参数,图片对象、图像坐标(左上角坐标与右下角坐标),颜色通道,矩形线条宽度,通过这个函数绘制出一个矩形,圈出人脸;circle()函数用来绘制圆,和参数和矩形大致一样,第二个和第三个参数要注意是圆心的坐标和半径

    代码即详细注释如下(矩形):

    1. import cv2 as cv
    2. ret = cv.imread("jaychou.jpg")
    3. #左上角的坐标是(x,y),矩形的宽度和高度为w,h
    4. x, y, w, h = 100, 100, 100, 100
    5. #绘制矩形,color=(0, 255, 0)这里代表圈起来的是绿色,thickness=2表示线条的宽度
    6. cv.rectangle(ret, (x, y), (x + w, y + h), color=(0, 255, 0), thickness=2)
    7. #显示图片
    8. cv.imshow("rectangle_ret", ret)
    9. cv.waitKey(0)
    10. cv.destroyAllWindows()

    代码即详细注释如下(圆):

    1. import cv2 as cv
    2. ret = cv.imread("jaychou.jpg")
    3. # #左上角的坐标是(x,y),矩形的宽度和高度为w,h
    4. # x, y, w, h = 100, 100, 100, 100
    5. # #绘制矩形,color=(0, 255, 0)这里代表圈起来的是绿色,thickness=2表示线条的宽度
    6. # cv.rectangle(ret, (x, y, x + w, y + h), color=(0, 255, 0), thickness=2)
    7. #绘制圆,r为半径,(x,y)为圆心坐标
    8. x, y, r = 200, 200, 100
    9. #center是圆心坐标,radius是半径大小
    10. cv.circle(ret, center=(x, y), radius=r, color=(0, 0, 255), thickness=2)
    11. #显示图片
    12. cv.imshow("rectangle_ret", ret)
    13. cv.waitKey(0)
    14. cv.destroyAllWindows()

    执行效果如下(还未进行人脸识别,所以不会框住人脸):

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

            如何做到人脸检测?就是要获取人脸特征,并且实现人脸跟踪,这就需要用到第三方库了,通过OpenCv官网:Home - OpenCV 上下载OpenCv,选择你当前主机的版本即可,这里就不多说了,详细的解释都在注释里面

    代码即详细注释如下:

    1. import cv2 as cv
    2. def face_check():
    3. # 灰度图片
    4. gray = cv.cvtColor(ret, cv.COLOR_BGR2GRAY)
    5. #加载特征数据,来自opencv中一个默认的扫描机制
    6. face_detector = cv.CascadeClassifier("D:/OpenCV/opencv/opencv/data/haarcascades/haarcascade_frontalface_alt2.xml")
    7. #检测
    8. faces = face_detector.detectMultiScale(gray)
    9. #针对人脸划分区域
    10. for x,y,w,h in faces:
    11. cv.rectangle(ret, (x, y), (x + w, y + h), color=(0, 255, 0), thickness=2)
    12. #检测完后进行显示
    13. cv.imshow("result", ret)
    14. #加载图片
    15. ret = cv.imread("jaychou.jpg")
    16. #检测人脸
    17. face_check()
    18. cv.waitKey(0)
    19. cv.destroyAllWindows()

    执行效果如下:

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

            视频实际上就是由多个照片一直播放形成的,所以想要检测视频中的人脸,就要对视频中的每一帧进行人脸检测OpenCv中给出了一个函数VideoCapture()用来存储视频,返回视频对象,通过调用read()函数即可以获取视频的每一帧,最后在结合之前所用到的一系列操作即可~

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

    1. import cv2 as cv
    2. def face_check(ret):
    3. # 灰度图片
    4. gray = cv.cvtColor(ret, cv.COLOR_BGR2GRAY)
    5. #加载特征数据,来自opencv中一个默认的扫描机制
    6. face_detector = cv.CascadeClassifier("D:/OpenCV/opencv/opencv/data/haarcascades/haarcascade_frontalface_alt2.xml")
    7. #检测
    8. faces = face_detector.detectMultiScale(gray)
    9. #针对人脸划分区域
    10. for x,y,w,h in faces:
    11. cv.rectangle(ret, (x, y), (x + w, y + h), color=(0, 255, 0), thickness=2)
    12. #检测完后进行显示
    13. cv.imshow("result", ret)
    14. #读取视频
    15. cap = cv.VideoCapture("jaychou.mp4")
    16. #读取视频上的图片,用循环读取每一张图片
    17. while True:
    18. flag, frame = cap.read()
    19. #如果视频播放的末尾,就退出循环
    20. if not flag:
    21. break
    22. #如果视频没到末尾,就把每一张图片放入检测
    23. # 检测人脸
    24. face_check(frame)
    25. #如果输入"q",就退出视频,这里每10毫秒播放一张图片
    26. if ord("q") == cv.waitKey(10):
    27. break
    28. #后面两步都是释放内存空间
    29. cv.destroyAllWindows()
    30. cap.release

    视频示例展示:

    智能人脸识项目最后成果


     

  • 相关阅读:
    Android studio实现自定义圆形进度条 带刻度进度条 计步效果 时速表 水波纹效果
    开启创客教育造物学的领域
    中电金信技术实践|配置中心组件的升级历程
    在window11上安装sshd
    【并发编程】为什么Hashtable和ConcurrentHashMap 是不允许键或值为 null 的,HashMap 的键值则都可以为 null?
    Java编程--单例模式(饿汉模式/懒汉模式)/阻塞队列
    读懂NFT地板价
    数据结构(Java):力扣&牛客 二叉树面试OJ题
    线程篇(JAVA)
    【Unity插件】 BehaviorTree 原理
  • 原文地址:https://blog.csdn.net/CYK_byte/article/details/126567483