OpenCV进行人脸识别(Python)

2022-09-27 15:37:50 浏览数 (1)

前言

本文环境

  • python 3.8
  • opencv-python 4.6.0.66

包管理器

安装包管理器

代码语言:javascript复制
pip install pipenv
pipenv install

添加opencv

代码语言:javascript复制
pipenv install opencv-python=4.6.0 -i https://pypi.tuna.tsinghua.edu.cn/simple

查看安装的依赖

代码语言:javascript复制
pipenv run pip list

安装所有配置文件中的依赖

代码语言:javascript复制
pipenv install

运行

代码语言:javascript复制
pipenv run python main.py

人像识别

导入的时候使用

代码语言:javascript复制
import cv2

训练库

https://gitee.com/mirrors/opencv/tree/4.x/data/haarcascades

https://github.com/opencv/opencv/tree/master/data/haarcascades

1)对于人脸检测,OpenCV提供以下(从最宽松到最严格):

  • haarcascade_frontalface_default.xml
  • haarcascade_frontalface_alt.xml
  • haarcascade_frontalface_alt2.xml
  • haarcascade_frontalface_alt_tree.xml

2) 对于眼睛检测,我们可以选择两种方法:

  • haarcascade_eye.xml
  • haarcascade_eye_tree_eyegasses.xml

原则

在识别的时候 如果是眼睛检测就最好是在单人并且主体是人像中找。 如果是人脸检测则主体要是人 否则识别效果特别差。

其中尝试了以下几个

haarcascade_frontalface_default.xml haarcascade_frontalface_alt.xml haarcascade_frontalface_alt2.xml haarcascade_frontalface_alt_tree.xml

经测试haarcascade_frontalface_alt2.xml效果较好。

识别代码

代码语言:javascript复制
import cv2

# 读取图片
image = cv2.imread('./imgs/01.png')

# 引入人像识别训练库 haarcascade_frontalface_alt2.xml
face_patterns = cv2.CascadeClassifier(r'.xmlhaarcascade_frontalface_alt2.xml')
# 获取识别到的人脸
faces = face_patterns.detectMultiScale(image, scaleFactor=1.1, minNeighbors=4, minSize=(6, 6))

print(faces)

# 将识别到的人脸框出来
for (x, y, w, h) in faces:
    cv2.rectangle(image, (x, y), (x   w, y   h), (0, 255, 0), 2)

# 生成一张新的图片保存识别结果
cv2.imwrite('./imgs/02.jpg', image)

识别前

识别后

OpenCV常用操作

窗口显示图片

代码语言:javascript复制
cv2.namedWindow("Image",0);
cv2.resizeWindow("Image", 800, 500);
cv2.imshow("Image", image)

while True:
    c = cv2.waitKey(1)
    if c == 27:
        cv2.destroyAllWindows()
        break

其中

代码语言:javascript复制
cv2.namedWindow("Image",0);
cv2.resizeWindow("Image", 800, 500);

这两行是设置窗口的大小,默认是图片的实际大小。

后面是让程序死循环,否则会直接推出,这时按Esc才会推出。

获取摄像头画面

代码语言:javascript复制
import cv2

video = cv2.VideoCapture(0)
fps = video.get(cv2.CAP_PROP_FPS)
print(fps)
size = (int(video.get(cv2.CAP_PROP_FRAME_WIDTH)), int(video.get(cv2.CAP_PROP_FRAME_HEIGHT)))
print(size)
while True:
    ret, frame = video.read()
    cv2.imshow("A video", frame)
    c = cv2.waitKey(1)
    if c == 27:
        break
video.release()
cv2.destroyAllWindows()

摄像头添加人像识别

代码语言:javascript复制
import cv2

# 引入人像识别训练库 haarcascade_frontalface_alt2.xml
face_patterns = cv2.CascadeClassifier(r'.xmlhaarcascade_frontalface_alt2.xml')

video = cv2.VideoCapture(0)
fps = video.get(cv2.CAP_PROP_FPS)
print(fps)
size = (int(video.get(cv2.CAP_PROP_FRAME_WIDTH)), int(video.get(cv2.CAP_PROP_FRAME_HEIGHT)))
print(size)

timenum = 0
while True:
    ret, frame = video.read()
    # 降低解析的频率
    if timenum >= 1:
        timenum = 0
        # 获取识别到的人脸
        faces = face_patterns.detectMultiScale(frame, scaleFactor=1.1, minNeighbors=4, minSize=(60, 60))
        # 将识别到的人脸框出来
        for (x, y, w, h) in faces:
            cv2.rectangle(frame, (x, y), (x   w, y   h), (0, 255, 0), 2)

    cv2.imshow("Face", frame)
    c = cv2.waitKey(int(1000 / fps))
    timenum  = 1
    if c == 27:
        break

# 解除摄像头占用
video.release()
cv2.destroyAllWindows()

0 人点赞