OpenCV-Python实战(番外篇)——基于 Haar 级联的猫脸检测器
前言
在《人脸检测详解》中我们已经详细介绍了
OpenCV
中提供的基于
Viola
和
Jones
提出对象检测框架的人脸检测算法,我们同时也了解了,该对象检测框架也可用于检测其他物体,例如:车牌号或猫脸等。在本节中,我们将使用此框架检测猫脸。
基于 Haar 级联的猫脸检测器
基于
Haar
特征的级联分类器可用于检测人脸以外的对象,
OpenCV
库中提供了两个级联分类器文件用于猫脸检测。接下来我们使用这两个检测器来检测图像中的正面猫脸。
此程序《人脸检测详解》中介绍的代码非常相似,关键在于修改了加载的两个级联分类器文件,可以从 OpenCV 官方下载这些级联分类器文件:
- haarcascade_frontalcatface.xml
- haarcascade_frontalcatface_extended.xml
从加载的图像,到检测和绘制猫脸检测框的完整代码如下:
# 可视化函数defshow_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')defshow_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)——人脸检测详解
版权归原作者 盼小辉丶 所有, 如有侵权,请联系我们删除。