OpenCV(11):人脸检测、物体识别

embedded/2025/3/4 11:36:44/

1 人脸检测

        人脸检测是计算机视觉中的一个经典问题,而 OpenCV 提供了基于 Haar 特征分类器的人脸检测方法,简单易用且效果显著。本文将详细介绍如何使用 OpenCV 中的 cv2.CascadeClassifier() 进行人脸检测。

1.1 Haar 特征分类器

        Haar 特征分类器是一种基于 Haar-like 特征的机器学习方法,由 Paul Viola 和 Michael Jones 在 2001 年提出。它通过提取图像中的 Haar-like 特征,并使用 AdaBoost 算法进行训练,最终生成一个分类器,用于检测图像中的目标(如人脸)。

        Haar-like 特征是一种简单的矩形特征,通过计算图像中不同区域的像素值差异来提取特征。例如,一个 Haar-like 特征可以是两个相邻矩形的像素值之和的差值。这些特征能够捕捉到图像中的边缘、线条等结构信息。

        OpenCV 提供了预训练的 Haar 特征分类器,可以直接用于人脸检测。这些分类器以 XML 文件的形式存储,包含了训练好的模型参数。OpenCV 中的 cv2.CascadeClassifier() 类用于加载和使用这些分类器。

        人脸检测的实现步骤:

  1. 加载 Haar 特征分类器模型: 使用 cv2.CascadeClassifier() 加载预训练的人脸检测模型。

  2. 读取图像: 使用 cv2.imread() 读取待检测的图像。

  3. 转换为灰度图: 将图像转换为灰度图,因为 Haar 特征分类器在灰度图上运行更快。

  4. 检测人脸: 使用 detectMultiScale() 方法检测图像中的人脸。

  5. 绘制检测结果: 在图像中绘制检测到的人脸矩形框。

  6. 显示结果: 显示检测结果。

1.2 Python实现

        读取图片并转为灰度图像。

import cv2# 加载 Haar 特征分类器
face_cascade = cv2.CascadeClassifier(cv2.data.haarcascades + 'haarcascade_frontalface_default.xml')# 读取图像
image = cv2.imread('image.jpg')# 转换为灰度图像
gray_image = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)

        使用 cv2.CascadeClassifier.detectMultiScale() 方法进行人脸检测。该方法返回检测到的人脸区域的矩形框(x, y, w, h),其中 (x, y) 是矩形框的左上角坐标,w 和 h 分别是矩形框的宽度和高度。

# 进行人脸检测
faces = face_cascade.detectMultiScale(gray_image, scaleFactor=1.1, minNeighbors=5, minSize=(30, 30))
  • scaleFactor: 表示每次图像尺寸减小的比例,用于构建图像金字塔。默认值为 1.1。
  • minNeighbors: 表示每个候选矩形框应该保留的邻居数量。默认值为 5。
  • minSize: 表示检测目标的最小尺寸。默认值为 (30, 30)。

        在检测到人脸后,可以使用 cv2.rectangle() 方法在图像上绘制矩形框,标记出人脸的位置。最后,使用 cv2.imshow() 方法显示检测结果。

# 绘制检测结果
for (x, y, w, h) in faces:cv2.rectangle(image, (x, y), (x + w, y + h), (255, 0, 0), 2)# 显示结果
cv2.imshow('Detected Faces', image)
cv2.waitKey(0)
cv2.destroyAllWindows()

2 物体识别

        在计算机视觉领域,物体识别是一个非常重要的任务。OpenCV 是一个强大的开源计算机视觉库,提供了多种方法来实现物体识别。本文将详细介绍如何使用 OpenCV 中的模板匹配方法(cv2.matchTemplate())来进行物体识别。

2.1 模版匹配

2.1.1 什么是模板匹配?

        模板匹配是一种在图像中寻找与给定模板图像最相似区域的技术。简单来说,模板匹配就是在一幅大图像中寻找与模板图像(即我们想要识别的物体)最匹配的部分,这种方法适用于物体在图像中的大小、方向和形状基本不变的情况。

  • 模板图像: 目标物体的图像片段。
  • 搜索图像: 待检测的图像。
  • 匹配结果: 表示模板图像在搜索图像中的相似度分布。

2.1.2 模板匹配的基本原理

        模板匹配的基本原理是通过滑动模板图像在目标图像上移动,计算每个位置的相似度,并找到相似度最高的位置。OpenCV 提供了多种相似度计算方法,如平方差匹配(cv2.TM_SQDIFF)、归一化平方差匹配(cv2.TM_SQDIFF_NORMED)、相关匹配(cv2.TM_CCORR)、归一化相关匹配(cv2.TM_CCORR_NORMED)、相关系数匹配(cv2.TM_CCOEFF)和归一化相关系数匹配(cv2.TM_CCOEFF_NORMED)。

2.1.3 应用场景

  • 物体识别: 用于在图像中定位特定物体,如标志、图标等。
  • 目标跟踪: 用于在视频中跟踪目标物体。
  • 图像配准: 用于将两幅图像对齐。

2.1.4 模板匹配的实现步骤

  1. 加载图像: 读取搜索图像和模板图像。
  2. 模板匹配: 使用 cv2.matchTemplate() 在搜索图像中查找模板图像。
  3. 获取匹配结果: 使用 cv2.minMaxLoc() 获取最佳匹配位置。
  4. 绘制匹配结果: 在搜索图像中绘制匹配区域。
  5. 显示结果: 显示匹配结果。

2.1.5 匹配方法

        OpenCV 提供了多种模板匹配方法,可以通过 cv2.matchTemplate() 的第三个参数指定:

方法说明
cv2.TM_SQDIFF平方差匹配,值越小匹配度越高。
cv2.TM_SQDIFF_NORMED归一化平方差匹配,值越小匹配度越高。
cv2.TM_CCORR相关匹配,值越大匹配度越高。
cv2.TM_CCORR_NORMED归一化相关匹配,值越大匹配度越高。
cv2.TM_CCOEFF相关系数匹配,值越大匹配度越高。
cv2.TM_CCOEFF_NORMED归一化相关系数匹配,值越大匹配度越高。

2.2 使用 cv2.matchTemplate() 进行物体识别

        加载图像和模板

import cv2
import numpy as np# 加载目标图像和模板图像
img = cv2.imread('target.jpg', 0)
template = cv2.imread('template.jpg', 0)

        为了在目标图像中滑动模板图像,我们需要知道模板图像的宽度和高度。

# 获取模板图像的尺寸
w, h = template.shape[::-1]

        使用 cv2.matchTemplate() 函数进行模板匹配。该函数返回一个结果矩阵,其中每个元素表示目标图像中对应位置与模板图像的相似度。

# 进行模板匹配
res = cv2.matchTemplate(img, template, cv2.TM_CCOEFF_NORMED)

        我们可以设置一个阈值来确定匹配是否成功。然后,使用 cv2.minMaxLoc() 函数找到结果矩阵中的最大值和最小值的位置。

# 设置匹配阈值
threshold = 0.8# 找到匹配位置
loc = np.where(res >= threshold)

        最后,我们可以在目标图像中标记出与模板匹配的位置。通常,我们使用矩形框来标记匹配区域。

# 在目标图像中标记匹配位置
for pt in zip(*loc[::-1]):cv2.rectangle(img, pt, (pt[0] + w, pt[1] + h), (0, 255, 0), 2)# 显示结果图像
cv2.imshow('Matched Image', img)
cv2.waitKey(0)
cv2.destroyAllWindows()

        这里没有标记,估计与模版差距过大吧。


http://www.ppmy.cn/embedded/169905.html

相关文章

反向海淘南美市场案例:Cssbuy淘宝代购集运系统 PHP 搭建功能解析

在全球化电商蓬勃发展的当下,反向海淘业务在南美市场逐渐崭露头角。随着南美消费者对中国优质且丰富商品的需求日益增长,像 CSSBuy 这样的淘宝代购集运系统为满足这一需求提供了有力支持。对于开发者而言,了解如何运用 PHP 搭建针对南美市场的…

RAG组件:向量数据库(Milvus)

在当前大模型盛行的时代,大模型的垂类微调、优化成为产业落地、行业应用的关键;RAG技术应运而生,主要解决大模型对专业知识、实效性知识欠缺的问题; RAG的核心工作逻辑是将专业知识、实效知识等大模型欠缺的知识进行收集、打包、保…

C++核心指导原则: 标准库

C Core Guidelines 整理目录 哲学部分接口(Interface)部分函数部分类和类层次结构部分枚举部分资源管理部分表达式和语句部分性能部分并发和并行错误处理常量和不可变性泛型编程源文件命名和布局建议标准库 The Standard Library 标准库规则总结 SL.1: Use libraries wherev…

蓝桥杯 灯笼大乱斗【算法赛】

问题描述 元宵佳节&#xff0c;一场别开生面的灯笼大赛热闹非凡。NN 位技艺精湛的灯笼师依次落座&#xff0c;每位师傅都有相应的资历值&#xff0c;其中第 ii 位师傅的资历值为 AiAi​。从左到右&#xff0c;师傅们的资历值逐级递增&#xff08;即 A1<A2<⋯<ANA1​&l…

淘天集团算法岗-计算机视觉(T-Star Lab)内推

熟悉计算机视觉、机器学习、图像/视频分析与处理、多模态内容理解、AIGC等相关领域技术和应用&#xff1b; 具备极佳的工程实现能力&#xff0c;熟练掌握C/C、Java、Python等至少一门语言&#xff1b; 学习能力强&#xff0c;对新事物有好奇心&#xff0c;对所在领域有热情&a…

2025-03-03 学习记录--C/C++-PTA 7-38 数列求和-加强版

合抱之木&#xff0c;生于毫末&#xff1b;九层之台&#xff0c;起于累土&#xff1b;千里之行&#xff0c;始于足下。&#x1f4aa;&#x1f3fb; 一、题目描述 ⭐️ 二、解题思路 ⭐️ 主要利用进位加法器的思想&#xff08;将 小学时期就会的加法运算 转化成 计算机语言&…

Docker 常用指令手册(学习使用)

CentOS Docker 实用指令手册 1. 安装与配置 # CentOS 安装Docker sudo yum install -y yum-utils sudo yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo sudo yum install docker-ce docker-ce-cli containerd.io sudo systemctl st…

基于RK3588的重症监护信息系统应用解决方案

重症监护信息系统是医院临床信息系统的重要组成部分&#xff0c;也是医院信息化建设的重要组成部分。通过集成化的电子病历、实时监测、决策支持等功能&#xff0c;提高重症患者的诊疗效率和质量。 图片来源于网络 重症监护信息系统主要由数据信息采集单元、信息处理单元、通信…