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-CAM的IP地址
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()