【EPS32S3学习笔记】ESP32+OPENCV+人脸识别 本地部署

这篇具有很好参考价值的文章主要介绍了【EPS32S3学习笔记】ESP32+OPENCV+人脸识别 本地部署。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

系列文章目录

提示:这里可以添加系列文章的所有文章的目录,目录需要自己手动添加
例如:第一章 Python 机器学习入门之pandas的使用


提示:写完文章后,目录可以自动生成,如何生成可参考右边的帮助文档


前言

提示:这里可以添加本文要记录的大概内容:

从https://github.com/joachimBurket/esp32-opencv的TTGO Demo到想要人脸识别(或者其他检测)在opencv上运行,主要需要实现的就是objdetect库的静态编译。下面一步步把我的实现过程分享一下,由于对C++的不熟悉,中间走了一些弯路,感谢ChatGPT,作为工作小助手来说,实在是表现得不错。

ESP32+OPENCV+FaceDetect


提示:以下是本篇文章正文内容,下面案例可供参考
前提环境:ubuntu20.04

一、修改.sh文件,将objdetect库链接进来

在源文件目录下,找到esp32-opencv-master/esp32s3/scripts/文件夹,打开build_opencv_for_esp32s3.sh。(使用esp32目录下得也是可以的,针对得芯片不同)

# list of modules to compile
OPENCV_MODULES_LIST=core,imgproc,imgcodecs,objdetect,zlib

修改modules_list,将objectect添加进去。zlib好像本身core已经包含了,可以不添加。
之后运行.sh文件,编译完成之后,印象里会提示flann相关的有一个接口不可用,不可用的原因可能是跟GCC及编译器的缘由,错误类型是一些语法方面的警告,存在风险。这里可以可以直接屏蔽相关语句,把错误跳过去。
之后就可以完成静态库的编译,当然这只是第一步。

二、增加loadFromMemory接口

了解了一下C++和python环境下,opencv实现人脸识别的程序代码。可以参考:https://blog.csdn.net/new9232/article/details/127288336
第一步都是要加载用于检测的CascadeClassifier文件(级联分类器)。对于windows、linux、android这些操作系统来说,这是非常简单的,因为本身都有非常完善的文件系统。而ESP32S3本身是不带文件系统的,当然可以在esp32上运行MicroPython系统,但是怎样将opencv集成到上面,如何在上面运行之前实现的功能(屏幕、触摸、摄像头等),都是一些难题。所以还是在现有的框架下想办法。
也是看了load接口的源码收到一些启发。

bool CascadeClassifierImpl::load(const String& filename)
{
    oldCascade.release();
    data = Data();
    featureEvaluator.release();

    FileStorage fs(filename, FileStorage::READ);
    if( !fs.isOpened() )
        return false;

    FileNode fs_root = fs.getFirstTopLevelNode();

    if( read_(fs_root) )
        return true;

    // probably, it's the cascade in the old format;
    // let's try to convert it to the new format
    FileStorage newfs(".yml", FileStorage::WRITE+FileStorage::MEMORY);
    haar_cvt::convert(fs_root, newfs);
    std::string newfs_content = newfs.releaseAndGetString();
    newfs.open(newfs_content, FileStorage::READ+FileStorage::MEMORY);
    fs_root = newfs.getFirstTopLevelNode();

    if( read_(fs_root) )
        return true;

    return false;
}

其中在加载分类器文件之后,代码内部还做了一些处理,在内存中构建了一个.xml文件,并且对加载之后文件进行了重建(怕是一些早期的分类器文件,格式不对)。之后再重新写入到内存中的这个文件,最后从内存中的文件中寻找节点。
于是总体的思路有了,这些xml文件我们可以用现成的,或者以后自己训练完成的,将xml转换为.c格式数据数组,这样就可以加载到程序中,再通过内存构建方式,构建一个存在于内存中的文件,用来给之后的人脸识别使用。
当然过程没有说的那么简单,也是试错了很多。

1.利用winhex将xml文件导出到.c文件

将从原文件中的xml文件用winhex打开,我这里用的是haarcascade_frontalface_alt.xml:
【EPS32S3学习笔记】ESP32+OPENCV+人脸识别 本地部署
注:把原来xml文件中的一些注释内容删掉,一个是占内存,另外好像加载的时候容易失败。
选择 编辑》复制所有》C源码
【EPS32S3学习笔记】ESP32+OPENCV+人脸识别 本地部署
这样就得到了十六进制的原始数据,在工程中新建一个.c文件,将拷贝的内容复制进去。
另外修改一下变量的定义方式:

const  char haarcascade_frontalface_alt[] = {

为什么要这么修改后面就知道了。

2.构建loadFromMemory接口

直接附上代码了:

bool CascadeClassifierImpl::loadFromMemory(const String& fileBuffer)
{
    oldCascade.release();
    data = Data();
    featureEvaluator.release();

    FileStorage newfs(fileBuffer, FileStorage::READ+FileStorage::MEMORY);

    FileNode fs_root = newfs.getFirstTopLevelNode();
    if( read_(fs_root) )
        return true;

    return false;
}

功能就是从内存中(String类型的缓冲区),加载一个文件。文件是之前保存在fileBuffer中的。

3.参考示例

static CascadeClassifier faceCascade;
const String xmlString(haarcascade_frontalface_alt);
bool faceCascadeInit(void)
{
    opencvLogInit();
    ESP_LOGW(TAG, "load xml");
    if (faceCascade.loadFromMemory(xmlString)){
        ESP_LOGW(TAG, "Load OK");
        return 1;
    } else {
        ESP_LOGW(TAG, "Load Fail");
        return 0;
    }
}

这里就明白为什么之前的xml文件要那么定义,是为了方便的构建xmlString变量。
这样就可以完成分类器文件的加载,之后就可以使用这个分类器进行人脸识别等操作。

总结

提示:这里对文章进行总结:
自己虽然感觉有点小进步,但是实际上也只是成了一个从内存中load文件的方法。后面还需要有一些优化,现在的人脸识别的速度并不高,如果整个工程的功能少一点,一个核用来读取图像流,一个用来做人脸识别可能会更加流畅一点。文章来源地址https://www.toymoban.com/news/detail-488448.html

到了这里,关于【EPS32S3学习笔记】ESP32+OPENCV+人脸识别 本地部署的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 视频图像处理算法opencv在esp32及esp32s3上面的移植,也可以移植openmv

    opencv 在 esp32 及 esp32s3 上面的移植 Opencv 简介       OpenCV 是一个基于 Apache2.0 许可(开源)发行的跨平台计算机视觉和机器学习软件库,可以运行在 Linux 、 Windows 、 Android 和 Mac OS 操作系统上,它轻量级而且高效—— 由一系列 C 函数和少量 C++ 类构成,同时提供了 Python 、 R

    2024年02月09日
    浏览(43)
  • ESP32S3学习——LEDC LED PWM 控制器

    芯片:esp32s3 开发环境:espidfv4.4 1)LED 控制器 (LEDC) 主要用于控制 LED,也可产生 PWM 信号用于 其他设备 的控制。 该控制器有 8 路通道 ,可以产生独立的波形来驱动 RGB LED 等设备。 LED PWM 控制器可在 无需 CPU 干预 的情况下 自动改变占 空比,实现亮度和颜色渐变(因为这个功能

    2024年02月06日
    浏览(43)
  • ESP32S3串口实验

    ESP32S3 一共有三个 UART 通讯接口,设备号从 0~2,即 UART0,UART1,UART2。这三个串口的管脚不 是固定的,是可以重映射到任意的 IO 口的。 ESP32S3 的 BOOT 程序把 UART0 用于程序下载,LOG 输出,我们的第一个实验 hello world 的 LOG 就是从 UART0 输出的。这个实验的 UART1 和 UART2 没有外接

    2024年02月12日
    浏览(40)
  • ESP32S3入手体验测试

    🔖所入手的型号是 YD-ESP32-S3 N16R8 ,该款和乐鑫官方推出的 ESP32-S3-DevKitC-1 配置差不多。 🎈乐鑫官方介绍:ESP32-S3-DevKitC-1 v1.1 🔰两者采用的模组:ESP32-S3-WROOM-1 和ESP32-S3-WROOM-1U模组对比: 🍁 YD-ESP32-S3 和 ESP32-S3-DevKitC-1 硬件基本信息: 🛠核心模组配置都是可选。两款开发板从原

    2024年02月05日
    浏览(151)
  • esp32s3使用多串口

    我按照别人博客中设置串口2,串口打印有问题,因为没有看到esp32s3 多串口,就总结了一下自己的经验 下图为esp32的引脚图 下图为esp32s3的引脚图 ESP32-S3 有三个 UART(通用异步收发器)控制器,即 UART0、UART1、UART2,支持异步通信(RS232 和 RS485)和 IrDA,通信速率可达到 5 Mbps。

    2024年02月04日
    浏览(46)
  • ESP32S3系列--SPI主机驱动详解(一)

    SPI是一种串行同步接口,可用于与外围设备进行通信。 ESP32S3自带4个SPI外设,其中SPI0/SPI1内部专用,共用一组信号线,通过一个仲裁器访问外部Flash和PSRAM;SPI2/3各自使用一组独立的信号线;开发者可以使用SPI2/3控制外部SPI从设备(Slave device);其中SPI2作为主设备有6个片选,数据

    2023年04月09日
    浏览(46)
  • ESP32S3 ADC DMA使用记录(坑记录)(大牛欢迎给出建议)

    目前测到三个问题: 一、ADC DMA采样频率sample_freq_hz取值范围611-83333,虽然可以达到83333,但是只能是在while循环里面不停采样才可以,如果想要隔一段时间采样一次则不行,假如隔一段时间使用adc_digi_read_bytes读取40byte数据,结果经常会返回ESP_ERR_INVALID_STATE,且经常读取的数据

    2024年02月11日
    浏览(42)
  • ESP32S3使用esp-iot-solution SDK开发USBHID鼠标键盘教程

    ​ 手里最近翻到了一个ESP32S3开发板,于是想做个鼠标键盘玩玩,这是我第二次接触ESP32,上一次18年买的吃灰板子至今没上过电。新找到的S3看手册是支持OTG的,按照官方的教程搭建的WSL+VSCODE环境。然而一切准备就绪发现ESP-IDF里面没有USB-HIDdemo。没有demo怎么玩。于是乎查找资

    2024年02月09日
    浏览(50)
  • 基于OpenCV进行ESP32 CAM 的人脸和眼睛识别系统搭建

    在这个项目中,我们将构建一个 基于 ESP32 CAM 的人脸和眼睛识别系统 。本教程向大家介绍一种高效的无线 视频串流 方式。这里我们使用了 ESP32-CAM 模组,它是一个带有 ESP32-S 芯片的 小型摄像头模组。除了 OV2640 相机和多个用于连接外围设备的 GPIO 外,它还具有一个 microSD 卡

    2024年02月14日
    浏览(61)
  • Qt-OpenCV学习笔记--人脸识别

    本人从事机械设计12年,业余时间自学编程。 2022年4月6日,开始学习C#, 2022年9月7日,开始学习c++和Qt, 2022年10月28日,开始学习OpenCV, 今天终于搞定了传说中的 人脸识别  ,在此,做个记录。 人脸检测,是基于Haar特征的cascade分类器, 人脸识别,是基于LDA理论的Fisherface算

    2024年02月09日
    浏览(41)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包