【ESP32 |
您所在的位置:网站首页 › 微信存储到tf卡怎么用 › 【ESP32 |
VSCode+python+opencv+ESP32-CAM
本项目仅作为学习记录,不定时更新。 Arduino对于ESP32-CAM,我们使用Arduino来开发,首先需要准备一些硬件: ESP32-CAM ,在淘宝大约30rmb一个;烧录底座或USB转TTL模块 ;杜邦线若干 ;由于我采用的是烧录底座,所以只需要一根micro-usb线即可。 成功配置后,就可以在工具->开发板中找到“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 %db\n", 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 %db\n", 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 %db\n", 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 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这个文件夹 为了获取ESP32-CAM的视频流,我们需要将电脑和ESP32-CAM连接同一个wifi热点,在Arduino中烧录好代码后,打开串口监视器,波特率选择115200,则可以看到ESP32-CAM的ip地址。比如我的ip地址如下:
然后运行,即可在test窗口看到我们的图片,此时打开Arduino的串口监视器,可以看到读取速度约为10-15帧,具体情况和当时网速有关。 有一些朋友可能会遇到这种情况 2022.4.17 更新 拍照保存TF卡首先我们需要初始化TF卡。初始化TF卡的完整代码如下: // Init SD Card void sd_init() { //The argument ("/sdcard",true) means closing LED light on the board if (!SD_MMC.begin("/sdcard",true)) { Serial.println("Card Mount Failed"); return; } uint8_t cardType = SD_MMC.cardType(); if (cardType == CARD_NONE) { Serial.println("No SD card attached"); return; } Serial.print("SD Card Type: "); if (cardType == CARD_MMC) { Serial.println("MMC"); } else if (cardType == CARD_SD) { Serial.println("SDSC"); } else if (cardType == CARD_SDHC) { Serial.println("SDHC"); } else { Serial.println("UNKNOWN"); } //Get the size of SD card, unit: MB uint64_t cardSize = SD_MMC.cardSize() / (1024 * 1024); Serial.printf("SD 卡容量大小: %lluMB\n", cardSize); }这一段代码要放在setup函数前面。**注意,ESP32-CAM模块的TF卡槽仅支持4G容量,超过4G均无法成功识别。**这段方法写好后,工程文件开头的#include要包含如下几个头文件,并声明几个变量,用以作为文件名序号: #include #include #include #include #include #include #include #include #include #include "cJSON.h" #include "FS.h" #include "esp_camera.h" ... char path[] = "/1.jpg"; int order = 1;而在setup()函数中,在上面获取视频流的代码保持不变的情况下,需要添加一行代码: void setup(){ ... sd_init();//初始化TF卡 delay(5000); ... } }在loop()函数中,添加保存的代码。完整的loop()函数代码如下: void loop() { server.handleClient(); camera_fb_t * fb = esp_camera_fb_get(); sprintf(path,"/%d.jpg",order); if (fb == NULL) { Serial.println( "Get picture failed"); } else { fs::FS &fs = SD_MMC; Serial.printf("Writing file: %s\n", path); File file = fs.open(path, FILE_WRITE); if (!file) { Serial.println("Failed to Create a File!"); } else { file.write(fb->buf , fb->len); } esp_camera_fb_return(fb); order += 1; } }将代码上传到板子中并运行,然后取下TF卡,插入读卡器,并将读卡器插在电脑上,我们就可以看到保存在TF卡中的照片了。效果如下图所示: |
今日新闻 |
推荐新闻 |
CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3 |