当前位置: 首页 > web >正文

Python OpenCV图像处理与深度学习:Python OpenCV对象检测入门-Haar级联分类器与人脸检测

使用OpenCV进行对象检测:从基础到实践

学习目标

通过本课程,学员们将了解对象检测的基本概念,特别是如何使用OpenCV中的Haar级联分类器进行对象检测。同时,学员将能够掌握人脸检测的实现方法,并能够将这些技术应用到其他对象检测任务中。

相关知识点

  • Python OpenCV对象检测

学习内容

1 Python OpenCV对象检测

1.1 对象检测基础

对象检测是计算机视觉领域的一个重要分支,它涉及识别图像或视频中特定类别的对象,并确定它们的位置。对象检测技术在多个领域都有广泛的应用,如自动驾驶、安全监控、医疗图像分析等。在对象检测中,一个常见的任务是人脸检测,即在图像中找到人脸的位置。

对象检测算法通常包括以下几个步骤:

  1. 预处理:对输入图像进行预处理,如调整大小、灰度化等,以减少计算量并提高检测精度。
  2. 特征提取:从图像中提取有用的特征,这些特征可以是边缘、纹理、颜色等。
  3. 分类:使用训练好的分类器对提取的特征进行分类,判断是否为感兴趣的对象。
  4. 后处理:对检测结果进行后处理,如非极大值抑制(NMS)等,以去除重复的检测框。
1.2 OpenCV中的Haar级联分类器

OpenCV提供了一个强大的工具——Haar级联分类器,用于对象检测。Haar级联分类器是一种基于Haar特征的机器学习方法,它通过训练大量的正样本(包含对象的图像)和负样本(不包含对象的图像)来学习对象的特征。

1.2.1 Haar特征

Haar特征是一种简单而有效的图像特征,它通过计算图像中不同区域的像素值差异来描述图像的局部特征。常见的Haar特征包括边缘特征、线特征、中心特征等。这些特征可以捕捉图像中的边缘、线条和纹理信息。

1.2.2 级联分类器

级联分类器是一种多阶段的分类器,每个阶段都包含一个简单的分类器。图像首先通过第一个阶段的分类器,如果通过,则继续进入下一个阶段,否则被拒绝。这种结构可以快速排除大量非对象区域,从而提高检测速度。

1.2.3 训练Haar级联分类器

训练Haar级联分类器需要大量的正样本和负样本。正样本是包含对象的图像,负样本是不包含对象的图像。训练过程通常包括以下步骤:

  1. 特征提取:从正样本和负样本中提取Haar特征。
  2. 特征选择:使用AdaBoost算法选择最有效的特征。
  3. 训练分类器:使用选定的特征训练每个阶段的分类器。
  4. 级联:将多个阶段的分类器级联起来,形成最终的级联分类器。
1.2.4 使用OpenCV进行对象检测

执行以下指令获取测试图片。

wget https://model-community-picture.obs.cn-north-4.myhuaweicloud.com/ascend-zone/notebook_datasets/aeab04a22fab11f0ae31fa163edcddae/data.zip
cp notebook_datasets/aeab04a22fab11f0ae31fa163edcddae/data.zip .
unzip data.zip

OpenCV提供了cv2.CascadeClassifier类,用于加载训练好的Haar级联分类器模型,并进行对象检测。以下是一个简单的示例代码,演示如何使用OpenCV进行人脸检测:

import cv2
from matplotlib import pyplot as plt# 加载Haar级联分类器模型
face_cascade = cv2.CascadeClassifier('haarcascade_frontalface_default.xml')# 读取图像
image = cv2.imread('face.jpg')# 转换为灰度图像
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)# 进行人脸检测
faces = face_cascade.detectMultiScale(gray, scaleFactor=1.1, minNeighbors=5, minSize=(30, 30))# 绘制检测框
for (x, y, w, h) in faces:cv2.rectangle(image, (x, y), (x+w, y+h), (255, 0, 0), 2)
# 显示结果
plt.imshow(cv2.cvtColor(image, cv2.COLOR_BGR2RGB))
plt.title('Face Detection'), plt.xticks([]), plt.yticks([])
plt.show()

在这里插入图片描述

1.3 实战:人脸检测

在本课程中,学员将通过一个完整的实战项目,学习如何使用OpenCV进行人脸检测。学员将从图像预处理、特征提取、分类到后处理的每一个步骤进行详细讲解,并提供相应的代码示例。

1.3.1 图像预处理

图像预处理是对象检测的第一步,它包括调整图像大小、灰度化等操作。这些操作可以减少计算量并提高检测精度。

import cv2# 读取图像
image = cv2.imread('face.jpg')# 调整图像大小
resized_image = cv2.resize(image, (640, 480))# 转换为灰度图像
gray = cv2.cvtColor(resized_image, cv2.COLOR_BGR2GRAY)# 显示预处理后的图像
plt.imshow(cv2.cvtColor(gray, cv2.COLOR_BGR2RGB))
plt.title('Preprocessed Image'), plt.xticks([]), plt.yticks([])
plt.show()

在这里插入图片描述

1.3.2 特征提取

特征提取是对象检测的关键步骤,它从图像中提取有用的特征。在OpenCV中,使用Haar特征进行特征提取。

# 加载Haar级联分类器模型
face_cascade = cv2.CascadeClassifier('haarcascade_frontalface_default.xml')# 进行人脸检测
faces = face_cascade.detectMultiScale(gray, scaleFactor=1.1, minNeighbors=5, minSize=(30, 30))# 打印检测到的人脸数量
print(f'Number of faces detected: {len(faces)}')
Number of faces detected: 1
1.3.3 分类

分类是将提取的特征输入到训练好的分类器中,判断是否为感兴趣的对象。在OpenCV中,使用cv2.CascadeClassifier类进行分类。

# 绘制检测框
for (x, y, w, h) in faces:cv2.rectangle(resized_image, (x, y), (x+w, y+h), (255, 0, 0), 2)# 显示结果
plt.imshow(cv2.cvtColor(resized_image, cv2.COLOR_BGR2RGB))
plt.title('Face Detection'), plt.xticks([]), plt.yticks([])
plt.show()

在这里插入图片描述

1.3.4 后处理

后处理是对检测结果进行进一步处理,以去除重复的检测框。常见的后处理方法包括非极大值抑制(NMS)等。

import numpy as np# 非极大值抑制
def non_max_suppression(boxes, overlapThresh):if len(boxes) == 0:return []# 转换为numpy数组boxes = np.array(boxes)# 获取边界框的坐标x1 = boxes[:, 0]y1 = boxes[:, 1]x2 = boxes[:, 2]y2 = boxes[:, 3]# 计算边界框的面积area = (x2 - x1 + 1) * (y2 - y1 + 1)# 按照y2坐标排序idxs = np.argsort(y2)# 初始化保留的边界框索引pick = []while len(idxs) > 0:# 获取最后一个索引last = len(idxs) - 1i = idxs[last]pick.append(i)# 计算最大(x, y)和最小(x, y)xx1 = np.maximum(x1[i], x1[idxs[:last]])yy1 = np.maximum(y1[i], y1[idxs[:last]])xx2 = np.minimum(x2[i], x2[idxs[:last]])yy2 = np.minimum(y2[i], y2[idxs[:last]])# 计算交集的宽度和高度w = np.maximum(0, xx2 - xx1 + 1)h = np.maximum(0, yy2 - yy1 + 1)# 计算交集的面积inter = w * h# 计算重叠率overlap = inter / area[idxs[:last]]# 删除重叠率大于阈值的边界框idxs = np.delete(idxs, np.concatenate(([last], np.where(overlap > overlapThresh)[0])))return boxes[pick].astype("int")# 应用非极大值抑制
faces = non_max_suppression(faces, 0.3)# 绘制检测框
for (x, y, w, h) in faces:cv2.rectangle(resized_image, (x, y), (x+w, y+h), (255, 0, 0), 2)
# 显示结果
plt.imshow(cv2.cvtColor(resized_image, cv2.COLOR_BGR2RGB))
plt.title('Face Detection with NMS'), plt.xticks([]), plt.yticks([])
plt.show()

在这里插入图片描述

http://www.xdnf.cn/news/19735.html

相关文章:

  • SpringCloud框架组件梳理
  • SQL Server从入门到项目实践(超值版)读书笔记 25
  • go语言面试之Goroutine 数量控制, GC回收 和任务调度
  • JimuReport 积木报表 v2.1.3 版本发布,免费开源的可视化报表和大屏
  • 2025 金融行业证书怎么选?从能力适配到职业方向的理性梳理
  • 别让你的 AI 对话烂在聊天记录里!
  • 马健涛事件折射出中国音乐产业转型期的深层矛盾,最终解决之道在于完善我国音乐版权鉴定的技术标准
  • Linux系统之----客户端服务器设计(共享内存)
  • 一文通透!为什么 DBSCAN 能检测任意形状的簇 ?
  • 【开题答辩全过程】以 校园帮帮团跑腿系统的设计与实现为例,包含答辩的问题和答案
  • Redis持久化:RDB与AOF,五分钟快速掌握
  • React 第七十一节 Router中generatePath的使用详解及注意事项
  • 1. 从零开始搭建微服务架构1.0(登录模块)
  • 首屏优化讲解
  • springboot:数据校验
  • 【光照】Unity中的[光照模型]概念辨析
  • nginx关于root
  • AI使用指南:9月开学季,自动生成教学PPT
  • 基于 GEE 探索太湖区域 2010—2020 年增强型植被指数 EVI 时空变化
  • dify安装和配置
  • JS循环机制
  • 【ARMv7】开篇:掌握ARMv7架构Soc开发技能
  • 二叉树核心操作知识点整理
  • More Effective C++ 条款22:考虑以操作符复合形式(op=)取代其独身形式(op)
  • JAVA后端开发——forEach 与方法引用(::)详解
  • CoreShop微信小程序商城框架开启多租户-添加一个WPF客户端以便进行上传产品信息和图片(6)
  • 在本地使用 Docker 创建一个易受攻击的云环境
  • leetcode46.全排列
  • 【LLIE专题】一种语义感知知识引导的低照度图像增强方案
  • Day23 机器学习流水线(管道/pipeline)