首页 > 其他分享 >OpenCV 中的 Haar-cascade 检测

OpenCV 中的 Haar-cascade 检测

时间:2024-11-28 18:14:37浏览次数:8  
标签:xml haarcascade cascade Haar 检测 分类器 OpenCV

介绍

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

Haar-cascade 检测的工作原理

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

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

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

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

OpenCV中的Haar人脸检测

在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()

 

总结

 其实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特征分类器,可以识别和定位上半身人体的位置。

 

标签:xml,haarcascade,cascade,Haar,检测,分类器,OpenCV
From: https://www.cnblogs.com/liuliu1/p/18574885

相关文章

  • 【图像处理】用Python和OpenCV实现简单的图像增强与特征提取
    《PythonOpenCV从菜鸟到高手》带你进入图像处理与计算机视觉的大门!图像处理是计算机视觉领域的重要基础,而图像增强和特征提取是其中的关键技术。本文将详细探讨如何使用Python和OpenCV实现图像增强与特征提取。通过具体示例,我们将介绍滤波、直方图均衡化、边缘检测、......
  • rust中使用opencv和cuda
    最近公司有个要识别的项目需要计算机识别,于是就找到了opencv来进行,opencv的cuda版本需要自己来进行编译需要去opencv官网下载,我下载的版本是opencv4.10https://github.com/opencv/opencv/archive/refs/tags/4.10.0.zip还有需要opencv_contrib-4.10.0和cmake下载下载之前需要检......
  • 基于OpenCV视觉库让机械手根据视觉判断物体有无和分类抓取的例程
    项目实例,在一个无人封闭的隔绝场景中,根据视觉判断物件的有无,通过机械手进行物件分类提取,并且返回状态结果;实际的场景是有一个类似采血的固件支架盘,上面很多采血管,采血管帽颜色可能不同,也有可能支架盘上只有空位,没有放置采血管,需要机器操作。图像的大小,支架和物件的位置、大......
  • C/C++ openCV实现实时课室管理系统
    该系统能实时展示教室的使用状态,它通过分析摄像头传回的视频信息来判断教室中是否有课程正在进行,并将这些信息即时更新到教学楼大厅的显示屏上。由于各种不可预见的原因,预先制定的课程表可能无法准确反映教室的实际使用情况,因此这个实时系统提供了更加准确的参考。核心功能:(1)......
  • OpenCV 模板匹配全解析:从单模板到多模板的实战指南
    简介:本文深入探讨OpenCV中的模板匹配技术。详细介绍构建输入图像与模板图像的步骤,包括读取、截取、滤波与存储等操作。剖析cv2.matchTemplate语法及其参数含义,阐述不同匹配方法下结果值的意义。同时讲解cv2.minMaxLoc语法,并通过代码示例展示单模板匹配查找最小值与最......
  • OpenCV从入门到精通实战(七)——探索图像处理:自定义滤波与OpenCV卷积核
    本文主要介绍如何使用Python和OpenCV库通过卷积操作来应用不同的图像滤波效果。主要分为几个步骤:图像的读取与处理、自定义卷积函数的实现、不同卷积核的应用,以及结果的展示。卷积在图像处理中,卷积是一种重要的操作,它通过将图像与一个小的矩阵(称为卷积核或滤波器)进行运算......
  • OpenCV-Python 特征匹配
    37.1Brute-Force匹配的基础蛮力匹配器是很简单的。首先在第一幅图像中选取一个关键点然后依次与第二幅图像的每个关键点进行(描述符)距离测试,最后返回距离最近的关键点。对于BF匹配器,我们首先要使用cv2.BFMatcher()创建一个BFMatcher对象。它有两个可选参数。第......
  • Python 基于 opencv 的疲劳检测系统的研究与设计
    博主介绍:✌程序员徐师兄、7年大厂程序员经历。全网粉丝12w+、csdn博客专家、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌......
  • 【Opencv学习】PART1-图像基础处理
    目录一、图像的读入、显示和保存1、读入图像imread函数范例显示控制参数2、显示图像imshow函数范例 tipswaitkey函数含义delay参数: tipsdestoryAllWindows函数3、保存图像imwrite函数范例实操01-读入显示保存代码结果二、图像处理入门1、图像分类(图......
  • OpenCV:计算机视觉的瑞士军刀
    目录引言什么是OpenCV?OpenCV的主要特点OpenCV的应用领域如何开始使用OpenCVOpenCV基础代码示例图像读取和显示简单的图像处理边缘检测人脸识别深入探索OpenCV特征检测和描述图像分割视频处理深度学习与OpenCV结语引言OpenCV(OpenSourceComputerVisionLi......