27浏览
查看: 27|回复: 0

[ESP8266/ESP32] “ESP32-S3 AI摄像头”边缘轮廓检测—AI数万物

[复制链接]
本帖最后由 b8hqQHaWdEN1 于 2025-5-5 01:55 编辑

【概述】
“ESP32-S3 AI摄像头”模块是一款基于ESP32-S3的开发板,搭载了一个OV3660摄像头,集成了边缘AI处理能力的多功能开发平台,具备强大的神经网络计算能力,本项目就以该摄像头为核心,展示一下该摄像头强大的图像采集和边缘轮廓检测能力。
【项目来源】
本项目的灵感来源于路边的烧烤摊,在有一天吃夜宵时,贴主突发奇想,将”ESP32-S3 AI摄像头模块”的边缘轮廓检测用于结账时数签子,这样就可以脱离人工计数的误差,进一步解放双手,实现自动化建设,但是,该项目不仅仅只能用于数签子,还可以用于所有的同类计数识别,也可以进一步优化,实现多个种类同时识别的功能。
【功能点】
本项目分为设备端(“ESP32-S3 AI摄像头”)和客户端(电脑python),原理如下:
1. 设备端:以“ESP32-S3 AI摄像头”为核心,连接网络获取ip地址并建立Web服务器,通过摄像头采集JPEG图像上传到该ip地址服务器。
2. 客户端:通过访问相应URL获取图像数据,将图像数据解码为OpenCV图像格式-灰度图像-边缘检测-绘制轮廓,在窗口显示实时图像和边缘图像。通过按键实现计数的功能。
【未来展望】
目前该项目是通过摄像头采集数据发送至电脑,后续将移植到摄像头本地运行,在功能方面,不仅可以添加集成例如颜色识别的功能,另该项目更加智能化,也可以添加代码变量,统计各项数据,进一步完善该作品。
【功能实现】一.准备工作

设备端(使用Arduino ide开发环境):
1.下载Arduino IDE,下载esp32主板,这部分可以在产品维库中实现,因此不在赘述。
2.配置好该开发板参数,项目-导入库-管理库-下载好“WiFi”“WebServer”两个库文件。

客户端(电脑运行python开发环境):1.打开python代码,下载numpy和opencv-py两个库
2.在你的python开发环境输入
“pip install numpy”
”Pip install opencv-python“
回车并下载,
至此准备工作已全部完成。


二.代码实现

准备工作结束后就可以复制如下代码粘贴到Arduion ide中:
  1. #include <WiFi.h>
  2. #include <WebServer.h>
  3. #include <esp_camera.h>
  4. // ================= 用户配置区域 =================
  5. const char* ssid = "U123";    //替换你的wifi
  6. const char* password = "88888888";  //替换你的密码
  7. // 摄像头引脚配置
  8. #define PWDN_GPIO_NUM     -1
  9. #define RESET_GPIO_NUM    -1
  10. #define XCLK_GPIO_NUM     5
  11. #define Y9_GPIO_NUM       4
  12. #define Y8_GPIO_NUM       6
  13. #define Y7_GPIO_NUM       7
  14. #define Y6_GPIO_NUM       14
  15. #define Y5_GPIO_NUM       17
  16. #define Y4_GPIO_NUM       21
  17. #define Y3_GPIO_NUM       18
  18. #define Y2_GPIO_NUM       16
  19. #define VSYNC_GPIO_NUM    1
  20. #define HREF_GPIO_NUM     2
  21. #define PCLK_GPIO_NUM     15
  22. #define SIOD_GPIO_NUM     8
  23. #define SIOC_GPIO_NUM     9
  24. const framesize_t FRAME_SIZE = FRAMESIZE_QVGA;  // 320x240
  25. const int JPEG_QUALITY = 15;                    // 质量 (0-63)
  26. const int FB_COUNT = 3;                         // 帧缓冲区数量
  27. // ==============================================
  28. WebServer server(80);
  29. void setupCamera() {
  30.   camera_config_t config;
  31.   config.ledc_channel = LEDC_CHANNEL_0;
  32.   config.ledc_timer = LEDC_TIMER_0;
  33.   config.pin_d0 = Y2_GPIO_NUM;
  34.   config.pin_d1 = Y3_GPIO_NUM;
  35.   config.pin_d2 = Y4_GPIO_NUM;
  36.   config.pin_d3 = Y5_GPIO_NUM;
  37.   config.pin_d4 = Y6_GPIO_NUM;
  38.   config.pin_d5 = Y7_GPIO_NUM;
  39.   config.pin_d6 = Y8_GPIO_NUM;
  40.   config.pin_d7 = Y9_GPIO_NUM;
  41.   config.pin_xclk = XCLK_GPIO_NUM;
  42.   config.pin_pclk = PCLK_GPIO_NUM;
  43.   config.pin_vsync = VSYNC_GPIO_NUM;
  44.   config.pin_href = HREF_GPIO_NUM;
  45.   config.pin_sscb_sda = SIOD_GPIO_NUM;
  46.   config.pin_sscb_scl = SIOC_GPIO_NUM;
  47.   config.pin_pwdn = PWDN_GPIO_NUM;
  48.   config.pin_reset = RESET_GPIO_NUM;
  49.   config.xclk_freq_hz = 20000000;
  50.   config.pixel_format = PIXFORMAT_JPEG;
  51.   // 自适应配置
  52.   if(psramFound()){
  53.     config.frame_size = FRAME_SIZE;
  54.     config.jpeg_quality = JPEG_QUALITY;
  55.     config.fb_count = FB_COUNT;
  56.   } else {
  57.     config.frame_size = FRAMESIZE_SVGA;
  58.     config.jpeg_quality = 15;
  59.     config.fb_count = 1;
  60.   }
  61.   // 初始化摄像头
  62.   esp_err_t err = esp_camera_init(&config);
  63.   if (err != ESP_OK) {
  64.     Serial.printf("摄像头初始化失败: 0x%x", err);
  65.     ESP.restart();
  66.   }
  67.   // 图像方向修正
  68.   sensor_t *s = esp_camera_sensor_get();
  69.   s->set_vflip(s, 1);    // 垂直翻转(0关闭1开启)
  70.   s->set_hmirror(s, 1);  // 水平镜像(0关闭1开启)
  71. }
  72. void setupWiFi() {
  73.   WiFi.begin(ssid, password);
  74.   WiFi.setSleep(false);
  75.   
  76.   Serial.print("正在连接WiFi");
  77.   while (WiFi.status() != WL_CONNECTED) {
  78.     Serial.print(".");
  79.     delay(500);
  80.   }
  81.   
  82.   Serial.println("\nWiFi已连接");
  83.   Serial.print("访问地址: http://");
  84.   Serial.println(WiFi.localIP());
  85. }
  86. void handleJPG() {
  87.   camera_fb_t *fb = esp_camera_fb_get();
  88.   if(!fb) {
  89.     server.send(500, "text/plain", "Camera Error");
  90.     return;
  91.   }
  92.   WiFiClient client = server.client();
  93.   
  94.   // 构建完整HTTP响应
  95.   String response = "HTTP/1.1 200 OK\r\n";
  96.   response += "Content-Type: image/jpeg\r\n";
  97.   response += "Content-Length: " + String(fb->len) + "\r\n";
  98.   response += "Connection: close\r\n\r\n";
  99.   
  100.   // 分块发送数据
  101.   client.print(response);
  102.   client.write(fb->buf, fb->len);
  103.   esp_camera_fb_return(fb);
  104. }
  105. void setup() {
  106.   Serial.begin(115200);
  107.   delay(1000);  // 等待串口初始化
  108.   
  109.   setupCamera();
  110.   setupWiFi();
  111.   // 路由设置
  112.   server.on("/", HTTP_GET, [](){
  113.     server.sendHeader("Location", "/jpg");
  114.     server.send(302, "text/plain", "");
  115.   });
  116.   
  117.   server.on("/jpg", HTTP_GET, handleJPG);
  118.   
  119.   server.begin();
  120.   Serial.println("HTTP服务器已启动");
  121. }
  122. void loop() {
  123.   server.handleClient();
  124.   delay(2);
  125. }</font>
复制代码


步骤如下
设备端:
1.在Arduino IDE中选择esp32-s3主板及其串口
2.File->Examples->ESP32->Camera->CameraWebServer示例
3.使用下面的代码替换CameraWebServer中的代码,只要替换主程序即可
(注意:需要填入WIFI账号密码)
4.上传程序,静等连接WiFi,打开串口监视器返回IP地址(注:电脑和主板需在同一局域网中)
5.打开浏览器,在Web地址中粘贴获取的IP地址,刷新就可以查看摄像头获取的图片。
“ESP32-S3 AI摄像头”边缘轮廓检测—AI数万物图1
“ESP32-S3 AI摄像头”边缘轮廓检测—AI数万物图2

客户端:
  1. import cv2  
  2. import urllib.request
  3. import numpy as np
  4. url = 'http://192.168.0.106/jpg'  # 获取的esp32-s3 ai的ip地址
  5. # 创建显示窗口
  6. cv2.namedWindow("live transmission", cv2.WINDOW_AUTOSIZE)
  7. while True:
  8.     try:
  9.         # 获取图像数据
  10.         img_resp = urllib.request.urlopen(url)
  11.         imgnp = np.array(bytearray(img_resp.read()), dtype=np.uint8)
  12.         img = cv2.imdecode(imgnp, -1)
  13.         
  14.         # 如果图像为空则跳过后续处理
  15.         if img is None:
  16.             continue
  17.             
  18.         # 图像处理流程
  19.         gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
  20.         blurred = cv2.GaussianBlur(gray, (11, 11), 0)
  21.         canny = cv2.Canny(blurred, 30, 150)
  22.         dilated = cv2.dilate(canny, (1, 1), iterations=2)
  23.         contours, _ = cv2.findContours(dilated.copy(), cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
  24.         
  25.         # 绘制轮廓
  26.         cv2.drawContours(img, contours, -1, (0, 255, 0), 2)
  27.         
  28.         # 显示结果
  29.         cv2.imshow("Edge Detection", canny)
  30.         cv2.imshow("Live Feed with Contours", img)
  31.         
  32.         # 按键处理
  33.         key = cv2.waitKey(1) & 0xFF
  34.         if key == ord('q'):
  35.             break
  36.         elif key == ord('a'):
  37.             print(f"检测到轮廓数量: {len(contours)}")
  38.             
  39.     except Exception as e:
  40.         print(f"发生错误: {str(e)}")
  41.         break
  42. cv2.destroyAllWindows()</font>
复制代码


1.打开python开发环境,复制以上代码并粘贴,修改IP为串口监视器获取的IP地址
2.屏幕上显示实时图像和边缘检测图像
3.按下键盘的“Q”键退出程序,按下“A”键检测检测的边缘数量。


“ESP32-S3 AI摄像头”边缘轮廓检测—AI数万物图3





您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

为本项目制作心愿单
购买心愿单
心愿单 编辑
[[wsData.name]]

硬件清单

  • [[d.name]]
btnicon
我也要做!
点击进入购买页面
上海智位机器人股份有限公司 沪ICP备09038501号-4 备案 沪公网安备31011502402448

© 2013-2025 Comsenz Inc. Powered by Discuz! X3.4 Licensed

mail