介绍

OpenCV 是一个开源的计算机视觉库,它提供了许多用于图像处理和计算机视觉的功能。其中,Haar-cascade 检测是一种流行的技术,通常用于目标检测,如人脸、眼睛、手部等。这种方法基于机器学习,使用一系列的矩形特征(Haar 特征)来检测图像中的特定对象。

Haar-cascade 检测的工作原理

  1. ‌Haar 特征‌:是一种简单的矩形特征,用于描述图像中的局部亮度差异。这些特征对于捕捉边缘、线条和纹理等图像结构非常有效。

  2. ‌积分图‌:为了快速计算Haar特征,OpenCV 使用积分图。积分图允许我们在常数时间内计算任何矩形区域的像素和。

  3. ‌Cascade 分类器‌:一个单独的Haar特征可能不足以准确检测目标,因此,通常使用多个特征的组合。Cascade分类器是一个多级的分类器,每一级都包含多个Haar特征。通过逐级过滤,cascade分类器可以有效地减少非目标区域的误检,同时保持对目标区域的高检测率。

  4. ‌训练‌:创建Haar-cascade分类器需要大量的正样本(包含目标的图像)和负样本(不包含目标的图像)。通过机器学习算法(如Adaboost),可以从这些样本中学习并生成一个有效的分类器。

程序流程

 

OpenCV中的Haar人脸检测

参数说明

 1 mage:输入的图像,必须是灰度图,因为Haar特征是基于灰度的。
 2 scaleFactor:(可选)在图像尺寸减小的比例,即每次图像尺寸减小的比例。默认值为1.1,表示每次窗口尺寸减少10%。调整这个参数可以平衡检测的精度和速度:较小的scaleFactor值能够提高检测的细致程度,但会增加计算负担;而较大的值则可以减少计算量,加快处理速度,但可能会降低检测的准确性,从而错过一些较小或较远的目标。
 3 minNeighbors:(可选)构成检测目标的相邻矩形的最小个数。默认值为3,意味着有3个以上的检测标记存在时,才认为人脸存在。这个参数有助于减少误检,即非目标对象被错误地识别为目标的情况。设置一个较高的minNeighbors值可以更严格地筛选出真正的目标,从而减少误检,但同时也有可能将一些真正的目标遗漏,因为它们可能没有足够的邻近矩形满足条件。
 4 flags:(可选)这个参数通常被省略,flags参数用于定义检测模式,在使用低版本OpenCV时,它可能会被设置为cv2.CASCADE_SCALE_IMAGE,表示在多尺度检测时调整图像尺寸。它可以是以下几个值的组合:
 5 CASCADE_DO_ROUGH_SEARCH:快速搜索模式。
 6 CASCADE_FIND_BIGGEST_OBJECT:只检测最大的目标。
 7 CASCADE_SCALE_IMAGE:使用缩放图像进行检测(默认值)。
 8 minSize:(可选)目标的最小尺寸,小于这个尺寸的目标将被忽略。默认为(0, 0),表示没有限制。
 9 maxSize:(可选)目标的最大尺寸,大于这个尺寸的目标将被忽略。默认为(0, 0),表示没有限制。
10  返回值:
11 
12 rects:一个矩形列表,其中每个矩形包含检测到的对象的坐标和尺寸,格式为(x, y, w, h)。
13 levels:每个检测到的对象的金字塔层级。
14 scores:每个检测到的对象的置信度分数。
15 ————————————————
16 
17                           

 

在OpenCV中,Haar人脸检测功能通过CascadeClassifier类实现。首先,需要加载预训练的Haar特征分类器XML文件,然后使用detectMultiScale方法进行人脸检测。

 1 import cv2
 2 import numpy as np
 3 
 4 
 5 def image_read_from_chinese_path(image_file_name):
 6     image_numpy_data = cv2.imdecode(np.fromfile(image_file_name, dtype=np.uint8),
 7                                     -1)  # np.fromfile 读取图像文件,将其转换为 NumPy 数组
 8     return image_numpy_data
 9 
10 
11 # 级联分类器路径(训练器文件)
12 face_cascade = cv2.CascadeClassifier(
13     r'C:\Users\19225\PycharmProjects\test\src\user\static\haarcascade_frontalcatface.xml')  # 人脸检测的 Haar 级联分类器XML 文件路径
14 eye_cascade = cv2.CascadeClassifier(
15     r'C:\Users\19225\PycharmProjects\test\src\user\static\haarcascade_eye_tree_eyeglasses.xml')
16 
17 # 读取图像
18 img = image_read_from_chinese_path(r'C:\Users\19225\PycharmProjects\test\src\user\static\R.jpg')
19 
20 if img is None:
21     print("Image not loaded correctly.")
22 else:
23     gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)  # 转为灰度图
24 
25     # 使用人脸检测器 face_cascade,在灰度图像中检测人脸
26     # scaleFactor:每次图像尺寸减少的比例,越小越快,检测效果越好
27     # minNeighbors:最少需要检测到多少个邻居,才能确定是人脸,值越大,检测精度越高
28     # minSize:检测到的对象的最小尺寸,单位为像素
29     faces = face_cascade.detectMultiScale(gray, scaleFactor=1.05, minNeighbors=3, minSize=(30, 30),
30                                           flags=cv2.CASCADE_SCALE_IMAGE)
31 
32     for (x, y, w, h) in faces:
33         img = cv2.rectangle(img, (x, y), (x + w, y + h), (255, 0, 0), 2)
34 
35         roi_gray = gray[y: y + h, x: x + w]
36         roi_color = img[y: y + h, x: x + w]
37 
38         # 检测眼睛
39         eyes = eye_cascade.detectMultiScale(roi_gray, scaleFactor=1.1, minNeighbors=5, minSize=(15, 15))
40 
41         # 进行非极大值抑制
42         eyes = np.array(eyes)
43         if len(eyes) > 0:
44             boxes = []
45             for (ex, ey, ew, eh) in eyes:
46                 boxes.append((ex, ey, ew, eh))
47 
48             # 自定义合并重叠的框
49             boxes = np.array(boxes)
50             indices = cv2.dnn.NMSBoxes(boxes.tolist(), [1] * len(boxes), score_threshold=0.5, nms_threshold=0.4)
51 
52             for i in indices:
53                 i = i[0]  # 如果是二维数组取第一个元素
54                 ex, ey, ew, eh = boxes[i]
55 
56                 # 防止绘制重复的眼睛
57                 cv2.rectangle(roi_color, (ex, ey), (ex + ew, ey + eh), (0, 0, 255), 2)
58         print(f'Detected {len(eyes)} eyes in face')
59     print(f'Detected {len(faces)} faces')
60 
61     label = f'OpenCV Haar Detected {str(len(faces))} faces'
62     cv2.putText(img, label, (10, 20), cv2.FONT_HERSHEY_SIMPLEX, 0.8, (0, 255, 0), 1)
63 
64     cv2.imshow('img', img)
65     cv2.waitKey(0)
66     cv2.destroyAllWindows()

 

示例二:检测车牌号

 1 # 导入所需库
 2 import cv2
 3 import numpy as np
 4 
 5 # 读取输入图像
 6 img = cv2.imread(r"C:\Users\19225\PycharmProjects\test\src\user\static\car.jpg")
 7 
 8 # 将输入图像转换为灰度图像
 9 gray = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)
10 
11 # 读取检测车牌的haarcascade
12 cascade = cv2.CascadeClassifier(
13     r'C:\Users\19225\PycharmProjects\test\src\user\static\haarcascade_russian_plate_number.xml')
14 
15 # 检测车牌号码
16 plates = cascade.detectMultiScale(gray, 1.2, 5)
17 print('Number of detected license plates:', len(plates))
18 
19 # 循环遍历所有车牌
20 for (x, y, w, h) in plates:
21     # 在车牌周围绘制边界矩形
22     cv2.rectangle(img, (x, y), (x + w, y + h), (0, 255, 0), 2)
23     gray_plates = gray[y:y + h, x:x + w]
24     color_plates = img[y:y + h, x:x + w]
25 
26     # 保存检测到的车牌
27     cv2.imwrite('Numberplate.jpg', gray_plates)
28     cv2.imshow('Number Plate', gray_plates)
29     cv2.imshow('Number Plate Image', img)
30     cv2.waitKey(0)
31 cv2.destroyAllWindows()

 

 

总结

 其实OpenCV中已经包含了许多预先训练好的Haar Cascades分类器,例如用于面部检测的haarcascade_frontalface_default.xml,以及用于眼睛检测的haarcascade_eye.xml。这些分类器可以用于快速识别图像或视频中的人脸和眼睛。

使用Haar Cascades进行对象检测的基本流程包括:

加载Haar Cascades分类器XML文件。
读取图像并将其转换为灰度图像,因为Haar Cascades主要在灰度图像上工作。
使用detectMultiScale函数在图像中检测对象。
根据检测结果在原始图像上绘制矩形框或其他标记。

Haar Cascades模型在训练过程中使用了大量的正负样本图像,并经过一系列的训练和验证,以达到较好的检测效果。每个模型都针对特定的目标或特征进行了训练,并具有其自己的应用场景。选择适当的模型取决于你的具体应用需求。

如果你需要进行特定的对象检测任务,例如检测猫脸、车牌或微笑等,OpenCV同样提供了相应的Haar Cascades模型。这些模型可能需要根据特定场景进行调整和优化,以提高检测的准确性和鲁棒性[1]。

总的来说,Haar Cascades是一个非常强大且灵活的工具,适用于各种实时对象检测任务,尤其是在计算机视觉和机器学习领域。
————————————————

原文链接:https://blog.csdn.net/yanceyxin/article/details/139726324

各种.xml文件说明

在OpenCV安装目录中,具体位置如下:opencv\build\etc\haarcascades(我是抠了其他作者下载在网盘里的xml文件,没下载opencv)

 

文件说明

 1 haarcascade_eye.xml
 2 
 3 是一个用于眼睛检测的Haar特征分类器模型,它是OpenCV库中用于目标检测任务的预训练级联分类器之一。这个XML文件包含了用于检测图像或视频中眼睛的模型参数。通过使用这个XML文件,可以快速实现人眼的自动检测功能。(我觉得检测不准确)
 4 
 5 -------------------------------------------------------------------
 6 haarcascade_eye_tree_eyeglasses.xml
 7 
 8 是OpenCV中用于眼睛检测的Haar Cascades分类器,特别适用于同时检测眼睛和眼镜。这个XML文件包含了训练好的模型参数,能够识别图像中的眼睛,即使眼睛上戴着眼镜也不会影响检测效果。
 9 
10 ------------------------------------------------------------------
11 haarcascade_frontalcatface.xml
12 
13 是 OpenCV 中用于猫脸检测的 Haar Cascades 分类器。这个 XML 文件包含了训练好的模型参数,专门用于识别图像中猫的面部特征。如果你正在开发一个应用程序,需要识别和处理猫的图像,这个分类器可以非常有用。
14 
15 -----------------------------------------------------------------
16 
17 haarcascade_frontalcatface_extended.xml
18 
19 是 OpenCV 中用于猫脸检测的扩展版 Haar Cascades 分类器。与基本的 haarcascade_frontalcatface.xml 相比,这个扩展模型可能经过了更多的训练,以提高在不同条件下猫脸检测的准确性和鲁棒性。它专门用于识别图像中猫的面部特征,尤其适用于更复杂或更具挑战性的场景。
20 
21 ————————————————
22 haarcascade_frontalface_alt.xml
23 
24 是 OpenCV 中用于人脸检测的 Haar Cascades 分类器之一。它是一个预训练的模型,专门设计来识别图像中的人脸。与 OpenCV 中的默认人脸检测模型 haarcascade_frontalface_default.xml 相比,haarcascade_frontalface_alt.xml 通常在检测率上有所提升,但可能会牺牲一些误检率。
25 
26 ————————————————
27 haarcascade_frontalface_alt.xml
28 
29 是 OpenCV 中用于人脸检测的 Haar Cascades 分类器之一。它是一个预训练的模型,专门设计来识别图像中的人脸。与 OpenCV 中的默认人脸检测模型 haarcascade_frontalface_default.xml 相比,haarcascade_frontalface_alt.xml 通常在检测率上有所提升,但可能会牺牲一些误检率。
30 
31 ————————————————
32 haarcascade_frontalface_alt_tree.xml
33 
34 是 OpenCV 中用于人脸检测的另一种 Haar Cascades 分类器。这个分类器模型采用了基于树的分类器结构,它通过组合多个级联分类器来提高检测的准确性,特别是在复杂场景下。然而,这种基于树的方法可能会增加计算时间,因为它需要评估多个分类器。
35 
36 ---------------------------------------------------------------------------
37 haarcascade_frontalface_alt2.xml
38 
39 这个分类器是 haarcascade_frontalface_alt.xml 的改进版本,旨在保持较高的检测率的同时,尽可能减少误检测。它可能在平衡检测率和误检率方面提供了更好的性能。
40 
41 --------------------------------------------------------------------------
42 haarcascade_frontalface_default.xml
43                         
44 是一个用于OpenCV库的XML文件,它包含了一个预先训练好的Haar特征分类器,用于人脸检测。这个分类器可以识别图像中的人脸,是计算机视觉领域中常用的工具之一。如果你需要使用这个文件进行人脸检测,通常你需要将它加载到OpenCV程序中,然后使用它来处理图像数据。
45 
46 
47 -------------------------------------------------------------
48 haarcascade_fullbody.xml
49 
50 包含了一个预先训练好的Haar特征分类器,专门用于全身人体检测。这个分类器可以识别图像或视频中的整个人体,是计算机视觉领域中用于人体分析的常用工具之一。
51 
52 ------------------------------------------
53 haarcascade_lefteye_2splits.xml
54 
55 是OpenCV中用于目标检测任务的级联分类器模型文件之一,专门用于检测图像或视频中的左眼 。这个XML文件包含了一个预先训练好的Haar特征分类器,可以识别和定位左眼的位置。
56 
57 -------------------------------------------
58 haarcascade_license_plate_rus_16stages.xml
59 
60 是OpenCV中用于目标检测任务的级联分类器模型文件,专门用于检测俄罗斯车牌。这个XML文件包含了一个预先训练好的Haar特征分类器,可以识别和定位车牌的位置。
61 
62 ---------------------------------------------
63 haarcascade_lowerbody.xml
64 
65 是OpenCV中用于目标检测任务的级联分类器模型文件,专门用于检测图像或视频中的下半身人体,例如腿部。这个XML文件包含了一个预先训练好的Haar特征分类器,可以识别和定位下半身人体的位置。
66 
67 -----------------------------------------------
68 haarcascade_profileface.xml
69 
70 是OpenCV中用于目标检测任务的级联分类器模型文件,专门用于检测图像或视频中的侧脸。这个XML文件包含了一个预先训练好的Haar特征分类器,可以识别和定位侧脸的位置。
71 
72 
73 ---------------------------------------
74 haarcascade_righteye_2splits.xml
75 
76 是OpenCV中用于目标检测任务的级联分类器模型文件,专门用于检测图像或视频中的右眼。这个XML文件包含了一个预先训练好的Haar特征分类器,可以识别和定位右眼的位置。这种分类器通常用于面部识别、情绪分析、用户界面和安全系统等应用中。
77 
78 ---------------------------------------
79 haarcascade_russian_plate_number.xml
80 
81 是一个用于OpenCV的XML文件,它包含了一个预先训练好的Haar特征分类器,专门用于检测俄罗斯车牌号码。这个分类器可以识别图像或视频中的车牌,并在检测到的车牌区域绘制矩形标记。
82 
83 ----------------------------------
84 haarcascade_smile.xml
85 
86 是OpenCV中用于目标检测任务的级联分类器模型文件,专门用于检测图像或视频中的微笑。这个XML文件包含了一个预先训练好的Haar特征分类器,可以识别和定位人脸上微笑的表情。
87 
88 ----------------------------------
89 haarcascade_upperbody.xml
90 
91 是OpenCV中用于目标检测任务的级联分类器模型文件,专门用于检测图像或视频中的上半身人体,例如头部和肩部。这个XML文件包含了一个预先训练好的Haar特征分类器,可以识别和定位上半身人体的位置。

 

posted on 2024-11-28 17:59  认真的六六  阅读(916)  评论(0)    收藏  举报