OpenCV-Python实战(番外篇)——基于 Haar 级联的猫脸检测器

x33g5p2x  于2021-12-31 转载在 Python  
字(2.3k)|赞(0)|评价(0)|浏览(704)

前言

《人脸检测详解》中我们已经详细介绍了 OpenCV 中提供的基于 ViolaJones 提出对象检测框架的人脸检测算法,我们同时也了解了,该对象检测框架也可用于检测其他物体,例如:车牌号或猫脸等。在本节中,我们将使用此框架检测猫脸。

基于 Haar 级联的猫脸检测器

基于 Haar 特征的级联分类器可用于检测人脸以外的对象,OpenCV 库中提供了两个级联分类器文件用于猫脸检测。接下来我们使用这两个检测器来检测图像中的正面猫脸。
此程序《人脸检测详解》中介绍的代码非常相似,关键在于修改了加载的两个级联分类器文件,可以从OpenCV 官方下载这些级联分类器文件:

  • haarcascade_frontalcatface.xml
  • haarcascade_frontalcatface_extended.xml

从加载的图像,到检测和绘制猫脸检测框的完整代码如下:

# 可视化函数
def show_img_with_matplotlib(color_img, title, pos):
    img_RGB = color_img[:, :, ::-1]
    ax = plt.subplot(2, 2, pos)
    plt.imshow(img_RGB)
    plt.title(title, fontsize=8)
    plt.axis('off')
def show_detection(image, faces):
    """在每个检测到的人脸上绘制一个矩形进行标示"""
    for (x, y, w, h) in faces:
        cv2.rectangle(image, (x, y), (x + w, y + h), (255, 0, 0), 5)
    return image

# 加载图像
img = cv2.imread("cat_face_detection.jpg")
# 将 BGR 图像转换为灰度图像
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
# 加载分类器文件
cas_catface = cv2.CascadeClassifier("haarcascade_frontalcatface.xml")
cas_catface_extended = cv2.CascadeClassifier("haarcascade_frontalcatface_extended.xml")

# 检测正面猫脸
faces_cas_catface = cas_catface.detectMultiScale(gray)
faces_cas_catface_extended = cas_catface_extended.detectMultiScale(gray)
retval, faces_haar_cat = cv2.face.getFacesHAAR(img, "haarcascade_frontalcatface.xml")
faces_haar_cat = np.squeeze(faces_haar_cat)
retval, faces_haar_cat_extended = cv2.face.getFacesHAAR(img, "haarcascade_frontalcatface_extended.xml")
faces_haar_cat_extended = np.squeeze(faces_haar_cat_extended)
# 绘制人脸检测框
img_cas_catface = show_detection(img.copy(), faces_cas_catface)
img_cas_catface_extended = show_detection(img.copy(), faces_cas_catface_extended)
img_faces_haar_cat = show_detection(img.copy(), faces_haar_cat)
img_faces_haar_cat_extended = show_detection(img.copy(), faces_haar_cat_extended)
# 可视化
show_img_with_matplotlib(img_cas_catface, "detectMultiScale(frontalcatface): " + str(len(faces_cas_catface)), 1)
show_img_with_matplotlib(img_cas_catface_extended, "detectMultiScale(frontalcatface_extended): " + str(len(faces_cas_catface_extended)), 2)
show_img_with_matplotlib(img_faces_haar_cat, "getFacesHAAR(frontalcatface): " + str(len(faces_haar_cat)), 3)
show_img_with_matplotlib(img_faces_haar_cat_extended, "getFacesHAAR(frontalcatface_extended): " + str(len(faces_haar_cat_extended)), 4)
plt.show()

此程序的输出结果如下图所示:

相关链接

OpenCV-Python实战(14)——人脸检测详解

相关文章