在《人脸检测详解》中我们已经详细介绍了 OpenCV
中提供的基于 Viola
和 Jones
提出对象检测框架的人脸检测算法,我们同时也了解了,该对象检测框架也可用于检测其他物体,例如:车牌号或猫脸等。在本节中,我们将使用此框架检测猫脸。
基于 Haar
特征的级联分类器可用于检测人脸以外的对象,OpenCV
库中提供了两个级联分类器文件用于猫脸检测。接下来我们使用这两个检测器来检测图像中的正面猫脸。
此程序《人脸检测详解》中介绍的代码非常相似,关键在于修改了加载的两个级联分类器文件,可以从OpenCV 官方下载这些级联分类器文件:
从加载的图像,到检测和绘制猫脸检测框的完整代码如下:
# 可视化函数
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()
此程序的输出结果如下图所示:
版权说明 : 本文为转载文章, 版权归原作者所有 版权申明
原文链接 : https://blog.csdn.net/LOVEmy134611/article/details/121006442
内容来源于网络,如有侵权,请联系作者删除!