树莓派4B_OpenCv学习笔记21:OpenCV_haar人脸识别

news2024/11/17 11:50:07

 今日继续学习树莓派4B 4G:(Raspberry Pi,简称RPi或RasPi)

 本人所用树莓派4B 装载的系统与版本如下:

 版本可用命令 (lsb_release -a) 查询:

 Opencv 版本是4.5.1:

 Python 版本3.7.3:

今日学习:OpenCV_haar人脸识别

文章提供测试代码讲解,整体代码贴出、测试效果图、完整测试工程下载

目录

 整体代码贴出:

测试效果图:

整体工程下载:

网上学习资料网址贴出:


 

基于Haar特征和AdaBoost算法训练而成的xml

 以下有XML关特征分类集的知识为AI生成:

1. 文件用途

  • 人脸检测:该文件能够识别并标记出图像或视频帧中的正面人脸区域。
  • 应用场景:广泛应用于人脸识别、安防监控、人脸支付等领域。

2. 算法原理

  • Haar特征:Haar特征是一种图像局部特征描述子,通过计算图像中特定区域的特征值(如黑白矩形框内的像素和之差)来描述图像的局部结构。这些特征能够有效地捕捉图像中的边缘、纹理等信息,适用于面部检测等任务。
  • AdaBoost算法:AdaBoost是一种集成学习算法,用于构建多个弱分类器,并将它们组合成一个强分类器。在Haarcascade算法中,AdaBoost算法用于优化级联分类器的性能,通过不断地对分类器进行训练和调整,提高分类器的准确性和鲁棒性。
  • 级联分类器:级联分类器是一种常用的分类器结构,它将多个弱分类器组合在一起,形成一个强分类器。在Haarcascade算法中,级联分类器用于将图像中的面部区域与非面部区域进行区分。

3. 文件位置

  • OpenCV安装目录:在OpenCV的安装目录下,通常可以在data/haarcascades文件夹中找到该文件。具体位置可能因OpenCV的安装方式和版本而有所不同。
  • GitHub仓库:OpenCV的GitHub仓库中也包含了该文件,可以在opencv/data/haarcascades路径下找到。

4. 使用方法

在OpenCV中,可以通过cv2.CascadeClassifier()函数加载haarcascade_frontalface_default.xml文件,创建一个人脸检测器对象。然后,使用该对象对图像或视频帧进行人脸检测。

5. 注意事项

  • 检测效果:虽然haarcascade_frontalface_default.xml文件在大多数情况下能够取得较好的检测效果,但在某些复杂场景下(如光照变化、遮挡、姿态变化等)可能会出现误检或漏检的情况。
  • 性能优化:为了提高检测性能和准确性,可以根据具体应用场景对模型进行调优或选择其他更适合的模型。

 

cv2.CascadeClassifier 是 OpenCV 库中用于对象检测(尤其是面部、眼睛、车辆等)的一个非常有效的工具。它基于 Viola-Li 积分图像和 AdaBoost 算法,能够快速地从图像中检测出预先训练好的对象。在你给出的例子中,haarcascade_frontalface_default.xmlhaarcascade_eye.xml 是两个预训练的 Haar 特征分类器文件,分别用于检测正面人脸和眼睛。

关于训练你自己的 Haar 特征分类器

可以训练你自己的 Haar 特征分类器,但这通常是一个相对复杂和耗时的过程,需要大量的标记数据(即带有标注的图像)和一定的机器学习知识。以下是训练 Haar 特征分类器的一般步骤:

  1. 收集数据集
    • 你需要收集大量的图像,这些图像应该包含你想要检测的对象(例如,不同角度、光照条件下的面部或眼睛)。
    • 这些图像需要被手动标注,指出每个对象的确切位置(通常是矩形框)。
  2. 准备数据
    • 将你的数据集转换为 OpenCV 需要的格式。这通常涉及到将图像和对应的标注信息组织成一定的文件结构。
  3. 训练分类器
    • 使用 OpenCV 的 opencv_traincascade 工具或类似的库来训练你的分类器。这个工具会读取你的数据集,提取 Haar 特征,并使用 AdaBoost 算法来训练一个分类器。
    • 训练过程可能需要多次迭代和调整参数,以达到最佳的检测效果。
  4. 评估分类器
    • 使用一个独立的测试集来评估你的分类器的性能。
    • 检查准确率、召回率和误报率等指标。
  5. 优化和部署
    • 根据测试结果优化你的分类器(例如,调整训练参数、收集更多数据等)。
    • 一旦你满意了分类器的性能,就可以将其部署到你的应用程序中。

注意事项

  • 训练 Haar 特征分类器需要大量的计算资源(CPU 时间和内存)。
  • 收集高质量、多样化的数据集对于训练出好的分类器至关重要。
  • Haar 特征分类器对于光照变化、遮挡和角度变化等因素比较敏感,可能需要在这些方面进行优化。

由于这些原因,许多开发者选择使用预训练的 Haar 特征分类器,或者探索其他更现代的对象检测方法,如基于深度学习的模型(如 YOLO、SSD、Faster R-CNN 等),这些方法在检测精度和效率方面通常表现更好。

 整体代码贴出:

这个代码展示了识别人脸以及人眼:

引用预先训练好的XML文件,XML文件要与python文件在同一目录!

# -*- coding: utf-8 -*-
import numpy as np
import cv2

# 这两行代码加载了Haar特征分类器,用于检测人脸和眼睛。
# haarcascade_frontalface_default.xml和haarcascade_eye.xml是预先训练好的XML文件,包含了检测人脸和眼睛所需的特征数据。
face_cascade = cv2.CascadeClassifier('haarcascade_frontalface_default.xml')
eye_cascade = cv2.CascadeClassifier('haarcascade_eye.xml')

cap = cv2.VideoCapture(0)

while 1:
    ret, img = cap.read()
    #cv2.flip(img,1)将图像水平翻转,因为摄像头捕获的图像通常是镜像的。
    img = cv2.flip(img,1)
    #cv2.cvtColor将图像从BGR颜色空间转换为灰度图像,因为Haar特征分类器在灰度图像上工作得更好。
    gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
    #使用人脸分类器在灰度图像上检测多个人脸。detectMultiScale方法返回检测到的面部的边界框列表。
    faces = face_cascade.detectMultiScale(gray, 1.3, 5)

    #遍历检测到的每个人脸,x,y,w,h分别是边界框的左上角坐标、宽度和高度。
    for (x,y,w,h) in faces:
        #使用cv2.rectangle在原始图像上绘制人脸的矩形框
        cv2.rectangle(img,(x,y),(x+w,y+h),(255,0,0),2)
        #从人脸区域中裁剪出ROI(Region of Interest,感兴趣区域),并在灰度图像和原始图像上分别进行裁剪
        roi_gray = gray[y:y+h, x:x+w]
        roi_color = img[y:y+h, x:x+w]
        print (int(x+w/2), int(y+h/2))
        #在人脸ROI上检测眼睛,并在检测到的眼睛位置绘制绿色矩形框
        eyes = eye_cascade.detectMultiScale(roi_gray)
        for (ex,ey,ew,eh) in eyes:
            cv2.rectangle(roi_color,(ex,ey),(ex+ew,ey+eh),(0,255,0),2)
    #显示处理后的图像
    cv2.imshow('img',img)

    key = cv2.waitKey(1) & 0xFF
    if key == ord("q"):
        break

cap.release()
cv2.destroyAllWindows()

测试效果图:

这里我在自己的PC电脑上也配置了python3.8 含有OpenCv 4.5.1的环境,

因此这第一张图先在 Pycharm 中测试了:

这是在树莓派远程连接测试的效果:

整体工程下载:

https://download.csdn.net/download/qq_64257614/89525385

网上学习资料网址贴出:

[树莓派基础]13.树莓派OpenCV人脸识别视频讲解_哔哩哔哩_bilibili

 https://download.csdn.net/download/qq_64257614/89525385

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1909066.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

昇思25天学习打卡营第16天 | 文本解码原理-以MindNLP为例

基于 MindSpore 实现 BERT 对话情绪识别 上几章我们学习过了基于MindSpore来实现计算机视觉的一些应用,那么从这期开始要开始一个新的领域——LLM 首先了解一下什么是LLM LLM 是 “大型语言模型”(Large Language Model)的缩写。LLM 是一种…

【高中数学/幂函数】比较a=1/2^2/3,b=1/5^2/3,c=1/5^1/3的大小

【问题】 已知:a1/2^2/3,b1/5^2/3,c1/5^1/3 求:a,b,c的大小关系? 【解答】 因为幂函数yx^2/3是在x正半轴是递增的,1/2>1/5,所以1/2^2/3>1/5^2/3,即a>b; 因为幂函数yx^1/3是在x正半轴也是递增的&#xff…

昇思25天学习打卡营第13天|应用实践之ResNet50迁移学习

基本介绍 今日的应用实践的模型是计算机实践领域中十分出名的模型----ResNet模型。ResNet是一种残差网络结构,它通过引入“残差学习”的概念来解决随着网络深度增加时训练困难的问题,从而能够训练更深的网络结构。现很多网络极深的模型或多或少都受此影响…

ScreenAI ——能理解从信息图表到用户界面的图像和文本算法解析

概述 论文地址:https://arxiv.org/pdf/2402.04615.pdf 信息图表(图表、示意图、插图、地图、表格、文档布局等)能够将复杂的数据和想法转化为简单的视觉效果,因此一直以来都被视为传播的重要元素。这种能力来自于通过布局和视觉线…

C#——序列化和反序列化概念

(1)序列化 在编程中,序列化是指将对象转换为可存储或传输的格式,例如将对象转换为 JSON 字符串或字节流。 (2)反序列化 在编程中,反序列化则是将存储或传输的数据转换回对象的过程。 序列化和反序列化经常用于数据的持久化、数据交换以及…

【计算机毕业设计】013新闻资讯微信小程序

🙊作者简介:拥有多年开发工作经验,分享技术代码帮助学生学习,独立完成自己的项目或者毕业设计。 代码可以私聊博主获取。🌹赠送计算机毕业设计600个选题excel文件,帮助大学选题。赠送开题报告模板&#xff…

【高中数学/指数函数】比较a=0.6^0.9 b=0.6^1.5 c=1.5^0.6的大小

【问题】 比较a0.6^0.9 b0.6^1.5 c1.5^0.6的大小 【解答】 指数函数y0.6^x是减函数&#xff0c;因为0.9<1.5,所以0.6^0.9>0.6^1.5,即a>b; 指数函数y1.5^x是增函数&#xff0c;1.5^0.6>1.5^01>0.6^0.9,即c>a; 综上&#xff0c;得出c>a>b的结论。 …

移动UI:该如何给页面降噪,给你支8招。

为什么我的移动UI页面看来这么复杂、为什么用户很迷茫&#xff0c;不知道如何操作&#xff0c;为什么很拥挤&#xff0c;核心原因还是页面噪声过多了&#xff0c;需要适当的降噪。 降低页面噪音&#xff0c;提高页面的简洁高效性是一个重要的设计目标。以下是一些降噪的设计方…

音频demo:使用opencore-amr将PCM数据与AMR-NB数据进行相互编解码

1、README a. 编译 编译demo 由于提供的.a静态库是在x86_64的机器上编译的&#xff0c;所以仅支持该架构的主机上编译运行。 $ make编译opencore-amr 如果想要在其他架构的CPU上编译运行&#xff0c;可以使用以下命令&#xff08;脚本&#xff09;编译opencore-amr[下载地…

终于搞定了通过两路蓝牙接收数据

一直想做无线传感器&#xff0c;通过蓝牙来接收数据&#xff0c;无奈因为arduino接收串口数据的一些问题&#xff0c;一直搁到现在。因为学校里给学生开了选修课&#xff0c;所以手边有一些nano和mega可以使用&#xff0c;所以就做了用两个nano加上两个蓝牙模块来发射数据&…

solidity:构造函数和修饰器、事件

构造函数​ 构造函数&#xff08;constructor&#xff09;是一种特殊的函数&#xff0c;每个合约可以定义一个&#xff0c;并在部署合约的时候自动运行一次。它可以用来初始化合约的一些参数&#xff0c;例如初始化合约的owner地址&#xff1a; address owner; // 定义owner变…

web前端开发——标签一

今天我来针对web前端开发讲解标签一 Html标签_标题&段落&换行 注释标签&#xff1a;Ctrl/ Ctrl/ &#xff0c;用户可能会获取到注释标签 注释的原则: •和代码逻辑一致 •尽量使用中文 •正能量 标题标签&#xff1a;<h1></h1> h1-h6 标题标签有6…

Nacos2.X源码分析:服务注册、服务发现流程

文章目录 Nacos2.1.X源码源码下载服务注册NacosClient端NacosServer端 服务发现NacosClient端NacosServer端 Nacos2.1.X源码 源码下载 源码下载地址 服务注册 官方文档&#xff0c;对于NamingService接口服务注册方法的说明 Nacos2.X 服务注册总流程图 NacosClient端 一个…

2024年浙江省高考分数一分一段数据可视化

下图根据 2024 年浙江高考一分一段表绘制&#xff0c;可以看到&#xff0c;竞争最激烈的分数区间在620分到480分之间。 不过&#xff0c;浙江是考两次取最大&#xff0c;不是很有代表性。看看湖北的数据&#xff0c;580分到400分的区段都很卷。另外&#xff0c;从这个图也可以…

【Mac】Folder Icons for mac(文件夹个性化图标修改软件)软件介绍

软件介绍 Folder Icons for Mac 是一款专为 macOS 设计的应用程序&#xff0c;主要用于个性化和定制你的文件夹图标。以下是它的主要特点和使用方法&#xff1a; 主要特点&#xff1a; 个性化文件夹图标 Folder Icons for Mac 允许用户为 macOS 上的任何文件夹定制图标。你…

k8s集群如kubeadm init和kube-flannel.yam问题

查看k8s中角色内容kubectl get all (显示pod和server以及delment) 删除应用资源选择删除先删除部署查看部署和pod没了服务还在&#xff0c;但资源和功能以及删除&#xff0c;删除服务kubectl delete 服务名&#xff08;部署名&#xff09;&#xff0c;get pods 获取默认空间的容…

Android C++系列:Linux进程(二)

1. fork #include <unistd.h> pid_t fork(void);子进程复制父进程的0到3g空间和父进程内核中的PCB,但id号不同。 fork调用一次返回两次 父进程中返回子进程ID子进程中返回0读时共享,写时复制#include <sys/types.h> #include <unistd.h> #include <…

高颜值官网(4):酒店民宿网站12个,看着看着就醉了。

对于高星级酒店或者高端酒店来说&#xff0c;拥有一个高颜值的官方网站是非常重要的。一个精美、专业的网站设计可以有效地展现酒店的品牌形象和服务质量&#xff0c;吸引目标客户群体并提高预订转化率。 这次分享12个&#xff0c;都是超高颜值的。

机器学习中的可解释性

「AI秘籍」系列课程&#xff1a; 人工智能应用数学基础 人工智能Python基础 人工智能基础核心知识 人工智能BI核心知识 人工智能CV核心知识 为什么我们需要了解模型如何进行预测 我们是否应该始终信任表现良好的模型&#xff1f;模型可能会拒绝你的抵押贷款申请或诊断你患…

break 和 continue 的区别与用法

break 和 continue 的区别与用法 1、break 语句2、continue 语句3、总结 &#x1f496;The Begin&#x1f496;点点关注&#xff0c;收藏不迷路&#x1f496; 在JAVA中&#xff0c;break 和 continue 是两种常用的控制流语句&#xff0c;它们主要用于在循环结构中改变程序的执行…