OpenCV-Python实战(番外篇)——基于 Haar 级联的猫脸检测器
Posted 盼小辉丶
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了OpenCV-Python实战(番外篇)——基于 Haar 级联的猫脸检测器相关的知识,希望对你有一定的参考价值。
OpenCV-Python实战(番外篇)——基于 Haar 级联的猫脸检测器
前言
在《人脸检测详解》中我们已经详细介绍了 OpenCV
中提供的基于 Viola
和 Jones
提出对象检测框架的人脸检测算法,我们同时也了解了,该对象检测框架也可用于检测其他物体,例如:车牌号或猫脸等。在本节中,我们将使用此框架检测猫脸。
基于 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实战(番外篇)——基于 Haar 级联的猫脸检测器的主要内容,如果未能解决你的问题,请参考以下文章
OpenCV-Python实战(番外篇)——利用增强现实制作美颜挂件,让你的照片与众不同
OpenCV-Python实战(番外篇)——OpenCV中利用鼠标事件动态绘制图形
OpenCV-Python实战(番外篇)——利用 SVM 算法识别手写数字
OpenCV-Python实战(番外篇)——OpenCV实现图像卡通化