栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Python

【ESP32-CAM】使用opencv获取ESP32-CAM视频流(一)

Python 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

【ESP32-CAM】使用opencv获取ESP32-CAM视频流(一)

VSCode+python+opencv+ESP32-CAM

本项目仅作为学习记录,不定时更新。

Arduino

对于ESP32-CAM,我们使用Arduino来开发,首先需要准备一些硬件:

  1. ESP32-CAM ,在淘宝大约30rmb一个;
  2. 烧录底座或USB转TTL模块 ;
  3. 杜邦线若干 ;

由于我采用的是烧录底座,所以只需要一根micro-usb线即可。


在使用Arduino之前,我们需要下载ESP32的库,其中也包含了ESP32-CAM,若还未配置完成,可以参照这篇博客进行配置。

成功配置后,就可以在工具->开发板中找到“AI Thinker ESP32-CAM”。由于安信可官方所提供的例程并不能在成功烧录后显示ip地址,所以我们使用大神yoursunny所提供的库,下载链接。

下载了.zip包之后,不需要解压,在项目->加载库->添加.ZIP库中添加即可。

基于下载的库,使用ESP32-CAM获取视频流的代码如下:

#include 
#include 
#include 

const char* WIFI_SSID = "******";  // 改成自己的wifi名称
const char* WIFI_PASS = "******";  // 改成自己的wifi密码

WebServer server(80);

static auto loRes = esp32cam::Resolution::find(320, 240);
static auto hiRes = esp32cam::Resolution::find(800, 600);

void handleBmp()
{
  if (!esp32cam::Camera.changeResolution(loRes)) {
    Serial.println("SET-LO-RES FAIL");
  }

  auto frame = esp32cam::capture();
  if (frame == nullptr) {
    Serial.println("CAPTURE FAIL");
    server.send(503, "", "");
    return;
  }
  Serial.printf("CAPTURE OK %dx%d %dbn", frame->getWidth(), frame->getHeight(),
                static_cast(frame->size()));

  if (!frame->toBmp()) {
    Serial.println("ConVERT FAIL");
    server.send(503, "", "");
    return;
  }
  Serial.printf("ConVERT OK %dx%d %dbn", frame->getWidth(), frame->getHeight(),
                static_cast(frame->size()));

  server.setContentLength(frame->size());
  server.send(200, "image/bmp");
  WiFiClient client = server.client();
  frame->writeTo(client);
}

void serveJpg()
{
  auto frame = esp32cam::capture();
  if (frame == nullptr) {
    Serial.println("CAPTURE FAIL");
    server.send(503, "", "");
    return;
  }
  Serial.printf("CAPTURE OK %dx%d %dbn", frame->getWidth(), frame->getHeight(),
                static_cast(frame->size()));

  server.setContentLength(frame->size());
  server.send(200, "image/jpeg");
  WiFiClient client = server.client();
  frame->writeTo(client);
}

void handleJpgLo()
{
  if (!esp32cam::Camera.changeResolution(loRes)) {
    Serial.println("SET-LO-RES FAIL");
  }
  serveJpg();
}

void handleJpgHi()
{
  if (!esp32cam::Camera.changeResolution(hiRes)) {
    Serial.println("SET-HI-RES FAIL");
  }
  serveJpg();
}

void handleJpg()
{
  server.sendHeader("Location", "/cam-hi.jpg");
  server.send(302, "", "");
}

void handleMjpeg()
{
  if (!esp32cam::Camera.changeResolution(hiRes)) {
    Serial.println("SET-HI-RES FAIL");
  }

  Serial.println("STREAM BEGIN");
  WiFiClient client = server.client();
  auto startTime = millis();
  int res = esp32cam::Camera.streamMjpeg(client);
  if (res <= 0) {
    Serial.printf("STREAM ERROR %dn", res);
    return;
  }
  auto duration = millis() - startTime;
  Serial.printf("STREAM END %dfrm %0.2ffpsn", res, 1000.0 * res / duration);
}

void setup()
{
  Serial.begin(115200);
  Serial.println();

  {
    using namespace esp32cam;
    Config cfg;
    cfg.setPins(pins::AiThinker);
    cfg.setResolution(hiRes);
    cfg.setBufferCount(2);
    cfg.setJpeg(80);

    bool ok = Camera.begin(cfg);
    Serial.println(ok ? "CAMERA OK" : "CAMERA FAIL");
  }

  WiFi.persistent(false);
  WiFi.mode(WIFI_STA);
  WiFi.begin(WIFI_SSID, WIFI_PASS);
  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
  }

  Serial.print("http://");
  Serial.println(WiFi.localIP());
  Serial.println("  /cam.bmp");
  Serial.println("  /cam-lo.jpg");
  Serial.println("  /cam-hi.jpg");
  Serial.println("  /cam.mjpeg");

  server.on("/cam.bmp", handleBmp);
  server.on("/cam-lo.jpg", handleJpgLo);
  server.on("/cam-hi.jpg", handleJpgHi);
  server.on("/cam.jpg", handleJpg);
  server.on("/cam.mjpeg", handleMjpeg);

  server.begin();
}

void loop()
{
  server.handleClient();
}
VSCode + opencv配置

在VSCode中,我使用windows+python进行开发,python版本为3.9。在这里,VSCode以及python的下载和配置就略过了,大家可以自行根据其他博客进行安装。对于opencv在VSCode里的下载和安装,我们进行详细的介绍。

首先需要使用pip下载opencv,依次在终端里使用如下命令进行安装:

pip install opencv-python
pip install opencv-contrib-python

下载后到下载路径找cv2这个文件夹

将该文件夹下的cv2.cp39-win_amd64.pyd文件

复制到你想做opencv项目的新文件夹里。至此,opencv的配置完成。

opencv获取视频流

为了获取ESP32-CAM的视频流,我们需要将电脑和ESP32-CAM连接同一个wifi热点,在Arduino中烧录好代码后,打开串口监视器,波特率选择115200,则可以看到ESP32-CAM的ip地址。比如我的ip地址如下:


然后我们使用复制过cv2.cp39-win_amd64.pyd文件的文件夹新建一个python文件。并且输入代码:

import urllib
import cv2
import numpy as np

url='http://192.168.43.103/cam-hi.jpg'// 改成自己的ip地址+/cam-hi.jpg

while True:
    imgResp=urllib.request.urlopen(url)
    imgNp=np.array(bytearray(imgResp.read()),dtype=np.uint8)
    img=cv2.imdecode(imgNp,-1)

    # all the opencv processing is done here
    cv2.imshow('test',img)
    if ord('q')==cv2.waitKey(10):
        exit(0)

然后运行,即可在test窗口看到我们的图片,此时打开Arduino的串口监视器,可以看到读取速度约为10-15帧,具体情况和当时网速有关。

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/529437.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号