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


    opencvesp32esp32s3上面的移植

    1. Opencv简介

          OpenCV是一个基于Apache2.0许可(开源)发行的跨平台计算机视觉和机器学习软件库,可以运行在LinuxWindowsAndroidMac OS操作系统上,它轻量级而且高效——由一系列 C 函数和少量 C++ 类构成,同时提供了PythonRubyMATLAB等语言的接口,实现了图像处理和计算机视觉方面的很多通用算法。

          这就使我们在esp32上实现OpenCV,进行图像处理以及计算机视觉成为了现实。

         2、Esp32s3简介

          ESP32-S3 ESP32 一样是一款同时支持WIFI和蓝牙功能,可以说是专为物联网而生的一款Soc,应用领域贯穿移动设备、可穿戴电子设备、智能家居等,在2,4GHz频带支持20MHz40MHz频宽,和以往 ESP32 不一样的是,蓝牙除了支持BLE以外,目前支持 Bluetooth 5 Bluetooth mesh,更多的GPIO口使其能控制的外设达到更多,全速USB OTG支持直接通过USB协议与芯片进行通信。

         最主要的是esp32s3具有双核的cpu。在图像处理方面有着先天的优势。

          Core0通常使用作为wifi数据传输的处理。Core1进行视觉处理进程的运行。

         3、移植硬件电路设计

          为实现esp32s3的视频处理的内存需求,我们选用内置8M flash,外扩8M spram的模组;摄像头采用了ov2640作为输入;另外,为了调试方便,采用了240*240LCD屏作为显示终端,可以实时看见图像处理结果。

          以下是原理图:

          整体系统效果如下:

          反面的摄像头以及补光灯:

         此开发板可以在某宝上面搜索esp32s3  opencv。首页-SimpleWiFi-淘宝网

       4、Demo软件效果

           一、Opencv中的目标拾取代码。通常,我们在图像处理的时候,需要对采集照片进行灰度处理,然后,对照片进行二值化处理。进而进行目标拾取。

          使用的函数为:

         Mat inputImage(fb->height, fb->width, CV_8UC2, fb->buf);      // rgb565 is 2 channels of 8-bit unsigned

        cvtColor(inputImage, inputImage, COLOR_BGR5652GRAY);

         threshold(inputImage, inputImage, 128, 255, THRESH_BINARY);

        轻松就会得到目标物体,效果如下:

          开发板中提供demo的源代码,可以使用esp-idf进行编译运行。

         二、如果进行颜色拾取的话,可以使用以下函数

              if (s->pixformat == PIXFORMAT_JPEG)

                {

                    TFT_jpg_image(CENTER, CENTER, 0, -1, NULL, fb->buf, fb->len);

                    esp_camera_fb_return(fb);

                    fb = NULL;

                }

                else

                {   

                     Mat inputImage(fb->height, fb->width, CV_8UC2, fb->buf);                cvtColor(inputImage, inputImage, COLOR_BGR5652BGR);

                     int pos_x = fb->width / 2;

                     int pos_y = fb->height / 2;

                     int blue = inputImage.at(pos_x, pos_y)[0];  // getting the pixel values//

                     int green = inputImage.at(pos_x, pos_y)[1]; // getting the pixel values//

                    int red = inputImage.at(pos_x, pos_y)[2];   // getting the pixel values//

                    updateColorCode(red, green, blue);

                    std::vector bgr_planes;

                    split(inputImage, bgr_planes);

                    float range[] = {0, 240};

                    const float *histRange = {range};

                    bool uniform = true;

                    bool accumulate = false;

                    Mat b_hist, g_hist, r_hist;

                    calcHist(&bgr_planes[0], 1, 0, Mat(), b_hist, 1, &histSize,

                             &histRange, uniform, accumulate);

                    calcHist(&bgr_planes[1], 1, 0, Mat(), g_hist, 1, &histSize,

                             &histRange, uniform, accumulate);

                    calcHist(&bgr_planes[2], 1, 0, Mat(), r_hist, 1, &histSize,

                             &histRange, uniform, accumulate);

                    drawHistogram(b_hist, g_hist, r_hist, inputImage);

                    drawCenterMark(inputImage);

                    updateCameraImage(inputImage);

                }

               esp_camera_fb_return(fb);

        5、结语 

           在视觉处理OpenCV有着开源的优势,小而精悍;esp32s3具有双核的CPU可以使用wifi进行通讯。这样就可以无线的方式传输图像处理结果。

  • 相关阅读:
    1154 Vertex Coloring 甲级 xp_xht123
    Thrift : Python RPC的实践
    【视觉SLAM】Bags of Binary Words for Fast Place Recognition in Image Sequences
    基于单片机的电子秤设计
    Python实现2048小游戏
    第03章_基本的SELECT语句
    免费 AI 代码生成器 Amazon CodeWhisperer 初体验
    虚拟机使用linux常用问题(虚拟机操作系统:ubuntu 22.04LTS)
    LeetCode | 344.反转字符串
    动态中位数(对顶堆)
  • 原文地址:https://blog.csdn.net/cszhang/article/details/132650281