当前位置:   article > 正文

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

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

视频示例展示:

智能人脸识项目最后成果


 

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/我家自动化/article/detail/101018
推荐阅读
相关标签
  

闽ICP备14008679号