当前位置:服务支持 >  软件文章 >  ESP32CAM自动计数器项目实战指南

ESP32CAM自动计数器项目实战指南

阅读数 34
点赞 0
article_banner

ESP32CAM库下载:

https://github.com/yoursunny/esp32cam

Arduino IDE烧录代码:

这段代码使用ESP32-CAM模块和esp32cam库创建了一个Web服务器。它提供了三个不同分辨率的JPEG图像:低分辨率、中等分辨率和高分辨率。客户端可以通过访问相应的URL来获取这些图像。

该代码的功能包括:

  • 连接到Wi-Fi网络

  • 初始化ESP32-CAM相机

  • 设置不同分辨率的图像

  • 启动Web服务器并处理客户端请求

  • 根据请求的URL切换到相应的分辨率设置

  • 捕获图像帧并将其发送给客户端

您可以根据自己的需求修改Wi-Fi网络的SSID和密码,以及不同分辨率的设置。

#include <WebServer.h>
#include <WiFi.h>
#include <esp32cam.h>

const char* WIFI_SSID = "ssid";  // Wi-Fi网络的SSID
const char* WIFI_PASS = "password";  // Wi-Fi网络的密码

WebServer server(80);  // 创建Web服务器对象,监听端口80

static auto loRes = esp32cam::Resolution::find(320, 240);  // 低分辨率设置
static auto midRes = esp32cam::Resolution::find(350, 530);  // 中等分辨率设置
static auto hiRes = esp32cam::Resolution::find(800, 600);  // 高分辨率设置

// 处理JPEG图像请求的函数
void serveJpg()
{
  auto frame = esp32cam::capture();  // 捕获图像帧
  if (frame == nullptr) {
    Serial.println("CAPTURE FAIL");  // 捕获失败
    server.send(503, "", "");  // 返回503状态码(服务不可用)
    return;
  }
  Serial.printf("CAPTURE OK %dx%d %db\n", frame->getWidth(), frame->getHeight(),
                static_cast<int>(frame->size()));  // 打印捕获成功的图像信息

  server.setContentLength(frame->size());  // 设置响应的内容长度
  server.send(200, "image/jpeg");  // 返回200状态码(成功),指定响应类型为image/jpeg
  WiFiClient client = server.client();  // 获取连接的客户端
  frame->writeTo(client);  // 将图像帧写入客户端
}

void handleJpgLo()
{
  if (!esp32cam::Camera.changeResolution(loRes)) {  // 切换到低分辨率设置
    Serial.println("SET-LO-RES FAIL");  // 设置失败
  }
  serveJpg();  // 处理JPEG图像请求
}

void handleJpgHi()
{
  if (!esp32cam::Camera.changeResolution(hiRes)) {  // 切换到高分辨率设置
    Serial.println("SET-HI-RES FAIL");  // 设置失败
  }
  serveJpg();  // 处理JPEG图像请求
}

void handleJpgMid()
{
  if (!esp32cam::Camera.changeResolution(midRes)) {  // 切换到中等分辨率设置
    Serial.println("SET-MID-RES FAIL");  // 设置失败
  }
  serveJpg();  // 处理JPEG图像请求
}

void setup(){
  Serial.begin(115200);
  Serial.println();
  {
    using namespace esp32cam;
    Config cfg;
    cfg.setPins(pins::AiThinker);  // 配置相机引脚(AI Thinker版)
    cfg.setResolution(hiRes);  // 设置初始分辨率为高分辨率
    cfg.setBufferCount(2);  // 设置图像帧缓冲区数量为2
    cfg.setJpeg(80);  // 设置JPEG图像质量为80

    bool ok = Camera.begin(cfg);  // 初始化相机
    Serial.println(ok ? "CAMERA OK" : "CAMERA FAIL");  // 打印相机初始化结果
  }
  WiFi.persistent(false);  // 关闭持久化存储
  WiFi.mode(WIFI_STA);  // 设置Wi-Fi模式为站点模式(连接到现有网络)
  WiFi.begin(WIFI_SSID, WIFI_PASS);  // 连接Wi-Fi网络
  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
  }
  Serial.print("http://");
  Serial.println(WiFi.localIP());  // 打印相机的本地IP地址
  Serial.println("  /cam-lo.jpg");
  Serial.println("  /cam-hi.jpg");
  Serial.println("  /cam-mid.jpg");

  server.on("/cam-lo.jpg", handleJpgLo);  // 处理低分辨率JPEG图像请求
  server.on("/cam-hi.jpg", handleJpgHi);  // 处理高分辨率JPEG图像请求
  server.on("/cam-mid.jpg", handleJpgMid);  // 处理中等分辨率JPEG图像请求

  server.begin();  // 启动Web服务器
}

void loop()
{
  server.handleClient();  // 处理Web客户端请求
}

Python代码:

这段代码通过从ESP32-CAM获取实时图像,并在图像上进行边缘检测和轮廓绘制,实现了以下功能:

  • 通过URL获取ESP32-CAM传输的实时图像数据

  • 将图像数据解码为OpenCV图像格式

  • 将图像转换为灰度图像

  • 使用Canny算法进行边缘检测

  • 对边缘图像进行膨胀操作

  • 查找并绘制轮廓

  • 在窗口中显示实时图像和边缘检测结果图像

  • 按下'q'键退出程序

  • 按下'a'键打印检测到的轮廓数量

通过这段代码,您可以实时查看ESP32-CAM捕获的图像,并进行简单的图像处理和分析,例如边缘检测和轮廓计数。

使用代码需安装:numpy跟opencv-py两个库

命令提示符输入:

pip install numpy 回车

pip install opencv-python 回车

import cv2
import urllib.request
import numpy as np

url = 'http://192.168.1.61/'  # ESP32-CAMIP地址

cv2.namedWindow("live transmission", cv2.WINDOW_AUTOSIZE)  # 创建一个窗口用于显示实时图像

while True:
    img_resp = urllib.request.urlopen(url + 'cam-lo.jpg')  # 从URL获取图像数据
    imgnp = np.array(bytearray(img_resp.read()), dtype=np.uint8)  # 将图像数据转换为NumPy数组
    img = cv2.imdecode(imgnp, -1)  # 解码JPEG图像数据

    gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)  # 将图像转换为灰度图像
    canny = cv2.Canny(cv2.GaussianBlur(gray, (11, 11), 0), 30, 150, 3)  # 使用Canny算法进行边缘检测
    dilated = cv2.dilate(canny, (1, 1), iterations=2)  # 对边缘图像进行膨胀操作
    (contours, _) = cv2.findContours(dilated.copy(), cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_NONE)  # 查找轮廓
    k = img
    cv2.drawContours(k, contours, -1, (0, 255, 0), 2)  # 在原始图像上绘制轮廓

    cv2.imshow("mit contour", canny)  # 显示边缘检测结果图像

    cv2.imshow("live transmission", img)  # 显示实时图像
    key = cv2.waitKey(5)

    if key == ord('q'):  # 按下'q'键退出程序
        break

    elif key == ord('a'):  # 按下'a'键打印轮廓数量
        count = len(contours)
        print(count)

cv2.destroyAllWindows()


免责声明:本文系网络转载或改编,未找到原创作者,版权归原作者所有。如涉及版权,请联系删
相关文章
QR Code
微信扫一扫,欢迎咨询~

联系我们
武汉格发信息技术有限公司
湖北省武汉市经开区科技园西路6号103孵化器
电话:155-2731-8020 座机:027-59821821
邮件:tanzw@gofarlic.com
Copyright © 2023 Gofarsoft Co.,Ltd. 保留所有权利
遇到许可问题?该如何解决!?
评估许可证实际采购量? 
不清楚软件许可证使用数据? 
收到软件厂商律师函!?  
想要少购买点许可证,节省费用? 
收到软件厂商侵权通告!?  
有正版license,但许可证不够用,需要新购? 
联系方式 155-2731-8020
预留信息,一起解决您的问题
* 姓名:
* 手机:

* 公司名称:

姓名不为空

手机不正确

公司不为空