【EPS32S3学习笔记】ESP32+OPENCV+OV2640+LVGL

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

系列文章目录

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


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


前言

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

前面已经完成了ESP32S3+LVGL+OV2640的工作,下一步就可以在这个基础上去增加OPENCV的模块了。
源代码还是用的GitHub上的:
esp32-opencv


提示:以下是本篇文章正文内容,下面案例可供参考

一、将OPENCV添加到工程

根据开源作者的描述,有三种方法。一个是直接用编译好的库,直接使用。再一个是利用写好的.sh文件重新编译一下,生成库,然后使用。第三种就是所有的命令一步步来。咱们就不用多想了直接使用编译好的库。

Faster way:
The first way is to simply get the pre-built OpenCV library in esp32/lib/ folder, and copy it into your project (see Compiling-esp-idf-project-using-opencv)

Fast way:
The second way is by using the script in build_opencv_for_esp32.sh. This script automatically compiles OpenCV from this repository sources, and install the needed files into the desired project. It can be tweaked as needed to add and remove some parts (see esp32/doc/build_configurations.md).

The script has 2 arguments. The first is the path to the toolchain-esp32.cmake (default is $HOME/esp/esp-idf/tools/cmake/toolchain-esp32.cmake), and the second is the path where the OpenCV library is installed (default is in ./esp32/lib).

Detailed way:
The last way explains all the commands and modifications done to be able to compile and run OpenCV on the ESP32. The detailed procedure is in esp32/doc/detailed_build_procedure.md.

由于我对cmake文件这些还不了解,直接按照提供的方法,把生成的库放到main文件夹下,修改CMakeList.txt。就可以直接编译通过了。

二、解决 undefined reference to sysconf 错误

编译好之后,如果调用例程,就会出现这样的提示。这个问题好像是因为获取内核数量的一个方法出现的异常,可能ESP32相关的支持还没有完善起来。这里说按照如下修改即可,但是查看下载后的源码其实都已经是修改好的,另外可能其他位置在编译的时候也会报错。

parallel.cpp:949:58: undefined reference to sysconf

This error appeared while trying to use the canny() method of the imgproc module

Fix: Modify modules/core/src/parallel.cpp

Change the line 947 in

#if !defined(_WIN32) && !defined(__APPLE__) && !defined(ESP32)
unsigned ncpus = std::thread::hardware_concurrency(); /* If the value is not well defined or not computable, returns 0 */

所以简单一点直接将相关代码删除,然后返回0即可。

这样修改完,通过上面的方法 build_opencv_for_esp32.sh可以再次编译,然后生成新的库文件。

三、生成新的Opencv库文件

这里也做了一些改动,考虑到原来的库是基于ESP32的,而且是IDF较早的版本。所以就考虑换成ESP32S3的,用最新的IDF版本,这样跟工程更贴近一点。
过程比较简单:
1、复制Opencv目录下的ESP32文件,改名字为ESP32S3;
2、 build_opencv_for_esp32.sh改名字 build_opencv_for_esp32s3.sh;
3、修改此文件的内容:仅修改CMAKE_PATH即可,其他都不用,CMAKE里面的参数也不用了。
4、运行这个bash文件,如果出现错误会有提示,全部结束后在lib文件夹下就有新的库文件了。

# path to the cmake file containing the toolchain informations
TOOLCHAIN_CMAKE_PATH=$HOME/esp/esp-idf/tools/cmake/toolchain-esp32s3.cmake

这个过程是在linux环境下进行的,没有搭建环境的,可以按照下面的StartGuide进行。
docs.espressif.com

四、添加TTGO示例

需要注意的是opencv库是C++环境下使用的,在之前工程里的c文件是不能直接使用的。当然也可以重新将使用OPENCV的文件切换成c++的模式,不过C++早都忘差不多了,一时半会捡不起来。用老方法,做一个中间件,将其中的方法抽离出来,通过接口调用。
【EPS32S3学习笔记】ESP32+OPENCV+OV2640+LVGL
main目录下新建opencvMid文件夹,里面新增imgProcess.cpp和imgProcess.h文件。
imgProcess.cpp文件源文件如下:


#include "imgProcess.h"

#undef EPS // specreg.h defines EPS which interfere with opencv
#include "opencv2/core.hpp"
#include "opencv2/imgproc.hpp"
#include "opencv2/imgcodecs.hpp"
#define EPS 192

#define ESP32

#ifdef __cplusplus
extern "C"
{
#endif

#include "esp_system.h"
#include <esp_log.h>

#define TAG "OPENCV"


using namespace cv;


uint32_t imgProcess(int height, int width, void *pBuf, char ucMode)
{

    Mat inputImage(height, width, CV_8UC2, pBuf); // rgb565 is 2 channels of 8-bit unsigned
    static Mat imageCopy;

    if(inputImage.empty()) {
        ESP_LOGW(TAG, "Can't display empty image");
        return 0;
    }

    if (ucMode == 0)
    {

    }
    else if (ucMode == 1)
    {
        cvtColor(inputImage, inputImage, COLOR_BGR5652GRAY);
    }
    else if (ucMode == 2)
    {
        cvtColor(inputImage, inputImage, COLOR_BGR5652GRAY);
        threshold(inputImage, inputImage, 128, 255, THRESH_BINARY);
    }
    else if (ucMode == 3)
    {
        cvtColor(inputImage, inputImage, COLOR_BGR5652GRAY);
        // Reduce noise with a kernel 3x3
        blur(inputImage, inputImage, Size(3, 3));
        /** Apply the canny edges detector with:
         * - low threshold = 50
         * - high threshold = 4x low
         * - sobel kernel size = 3x3
         */
        int lowThresh = 40;
        int kernSize = 3;
        Canny(inputImage, inputImage, lowThresh, 4 * lowThresh, kernSize);
    }

    if(inputImage.type() == CV_8UC1) {         // grayscale image
        cvtColor(inputImage, imageCopy, COLOR_GRAY2BGR565, 1);
    }
    else if(inputImage.type() == CV_8UC3) {    // BGR888 image
        cvtColor(inputImage, imageCopy, COLOR_BGR2BGR565, 1);
    }
    else if(inputImage.type() == CV_8UC2) {    // BGR565 image
        inputImage.copyTo(imageCopy);
    }

    return (uint32_t)(imageCopy.ptr<uchar>(0));

}
#ifdef __cplusplus
}
#endif

这里主要是实现了一个接口,imgProcess,输入参数为图像的长宽参数,源图像数据缓存,转换的模式。返回的是转换后的图像缓存的地址。

        ESP_LOGI(TAG, "Taking picture...");
        pic = esp_camera_fb_get();

        usCounter++;  

        my_img_dsc.data = (uint8_t *)imgProcess(240,320,(void *)(pic->buf),(usCounter++ / 100) % 4);

        GucFlag = 1;

        ESP_LOGI(TAG, "Picture taken! Its size was: %zu bytes", pic->len);
        ESP_LOGI(TAG, "W: %d H:%d format:%d", pic->width,pic->height,pic->format);
        esp_camera_fb_return(pic);

这样在camera获取图像之后,通过imgProcess得到转换后得图像数据地址,赋值给lvgl图片变量得数据地址参数。后面图像刷新得时候,在屏幕上就显示新的图像了。

ESP32S3+LVGL+OV2640+OPENCV


总结

提示:这里对文章进行总结:

感谢大家的支持。文章来源地址https://www.toymoban.com/news/detail-456425.html

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

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

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

相关文章

  • 基于STM32、OV2640及ESP8266的无线图传

            本文利用STM32F407单片机、OV2640摄像机模块以及ESP8266 WIFI模块,并基于C#编写的TCP上位机服务,来实现图像的无线传输。         本文受启发于博客:ESP8266+STM32F407+OV7670实现图片传输,在此感谢该文作者。与该文不同的是,本文采用的摄像机模块是0V2640,传输的

    2024年01月18日
    浏览(56)
  • ESP32S3串口实验

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

    2024年02月12日
    浏览(41)
  • 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 Sense接入百度在线语音识别】

    视频地址: ESP32S3 Sense接入百度在线语音识别 目前这是我使用的ESP32S3官方硬件👍👍👍(小小的身材有大大的力量)只需要35元加摄像头麦克风79元,后期我会整理相关专栏进行Arduino系统学习😘😘😘。有需要可以购买xiao开发板💕💕💕,SeeedXIAO ESP32S3 Sense硬件购买地址:

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

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

    2023年04月09日
    浏览(46)
  • 【ESP32S3 Sense接入语音识别+MiniMax模型对话】

    围绕ESP32S3 Sense接入语音识别+MiniMax模型对话展开,首先串口输入“1”字符,随后麦克风采集2s声音数据,对接百度在线语音识别,将返回文本结果丢入MiniMax模型,进而返回第二次结果文本,实现语言对话文本效果。以上一共有两次调用,后期只需加入tts模块就可完整对话。

    2024年04月16日
    浏览(69)
  • STM32F407ZGT6控制ESP8266与OV2640下的百度智能图片识别

    前言: STM32F407ZGT6控制OV2640下采集到JPG图片格式的二进制数据,然后对二进制数据进行BASE64编码,接着通过串口将数据传输给ESP8266并上传至训练好的EASYDL的AI算法识别平台进行识别并返回垃圾种类与边缘信息。 STM32与ov2640 ov2640简绍 stm32f407zgt6之dcmi stm32f407zgt6代码 main.c main.h l

    2024年02月04日
    浏览(55)
  • 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)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包