欢迎访问我的网站,希望内容对您有用,感兴趣的可以加入免费知识星球。

OpenCV中的人脸检测

OpenCV 迷途小书童 4年前 (2019-12-10) 4349次浏览 0个评论

软硬件环境

  • ubuntu 18.04 64bit
  • anaconda3 with python 3.6.4
  • opencv 3.4.2

视频看这里

Haar cascade分级器

haar,哈尔特征,是用于物体识别的一种数字图像特征,是最早用于即时人脸检测的算法。哈尔特征使用检测窗口中指定位置的相邻矩形,计算每一个矩形的像素和并取其差值,然后用这些差值来对图像的子区域进行分类。

使用基于haar特征的分级器来进行物体检测是一种非常有效的方法,它是由Paul ViolaMichael Jones在2001的论文Rapid Object Detection using a Boosted Cascade of Simple Features中提出。

在人脸的检测中,我们需要一个基于haar cascade的分级器,它是由正样本(带脸的图片)和负样本(没脸的图片)训练而成。OpenCV发行版中自带了已经训练好的分级器haarcascade_frontalface_default.xml,我们可以直接拿来使用。除了人脸,其它物体的检测opencv也提供了默认的分级器,可以到安装目录中查看,~/anaconda3/pkgs/opencv3-3.1.0-py36_0/share/OpenCV/haarcascades

代码实例

以检测摄像头中人脸为例,图片、视频文件都一样

import cv2
import sys

cascPath = sys.argv[1]
# 读取分级器文件
faceCascade = cv2.CascadeClassifier(cascPath)

# 打开摄像头
video_capture = cv2.VideoCapture(0)

while True:
    # 读取数据帧
    ret, frame = video_capture.read()

    gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)

    faces = faceCascade.detectMultiScale(
        gray,
        scaleFactor=1.1,
        minNeighbors=5,
        minSize=(30, 30),
        flags=cv2.CASCADE_SCALE_IMAGE
    )

    # 框出脸的位置
    for (x, y, w, h) in faces:
        cv2.rectangle(frame, (x, y), (x+w, y+h), (0, 255, 0), 2)

    # 显示
    cv2.imshow('Video', frame)

    if cv2.waitKey(1) & 0xFF == ord('q'):
        break

# 释放资源
video_capture.release()
cv2.destroyAllWindows()

运行上面的脚本

python test.py haarcascade_frontalface_default.xml

cv_haar_face

训练自己的分级器

查看官方的文档,https://docs.opencv.org/3.4/dc/d88/tutorial_traincascade.html,非常详尽。

参考资料

喜欢 (0)

您必须 登录 才能发表评论!