部分参考自https://www.itprojects.cn

环境搭建

使用Thonny

下载固件后,无需买烧录板,直接用用USB-TTL烧录micropython

烧录:




python代码中如何如何嵌入ESP32 的代码 python获取esp32cam_学习


烧录完后拔掉IO0与GND之间的线,然后就可以用了。

可以试试import camera库


python代码中如何如何嵌入ESP32 的代码 python获取esp32cam_Powered by 金山文档_02


1.2拍照

import camera


# 初始化摄像头
camera.init(0, format=camera.JPEG, fb_location=camera.PSRAM)

# 拍摄一张图片
buf = camera.capture()  # 大小是640x480

# 保存图片到文件
with open("第一张图片.png", "wb") as f:
    f.write(buf)  # buf中的数据就是图片的数据,所以直接写入到文件就行了
    print("拍照已完成,点击Thonny左侧【MicroPython设备】右侧的三,\n然后看到‘刷新’,点击刷新会看到 图片,\n然后右击图片名称,选择下载到电脑的路径即可...")
  • 上述程序可以运行1次,如果再次运行会出现OSError: Camera Init Failed,这个问题后面研究看看;临时的解决办法把板子的USB数据线拔掉,重新链接即可
  • 上述程序运行后的图片,需要下载到电脑上才能浏览,不支持在线浏览(不过,后面的课程会添加网络实时显示拍摄的画面,所以本节课不要想那么多,能看到图片就行)

改进:

import camera


# 初始化摄像头
try:
    camera.init(0, format=camera.JPEG)
except Exception as e:#如果报错
    camera.deinit()
    camera.init(0, format=camera.JPEG)

# 拍摄一张图片
buf = camera.capture()  # 大小是640x480

# 保存图片到文件
with open("第一张图片.png", "wb") as f:
    f.write(buf)  # buf中的数据就是图片的数据,所以直接写入到文件就行了
    print("拍照已完成,点击Thonny左侧【MicroPython设备】右侧的三,\n然后看到‘刷新’,点击刷新会看到 图片,\n然后右击图片名称,选择下载到电脑的路径即可...")

camera.deinit()

实时摄像,并显示

如果运行如下程序后,电脑端没有弹出视频窗口,请检查以下2点

  • ESP32-CAM是否与pc电脑连接相同的路由器(wifi,网线都行)
  • pc电脑是否关闭防火墙(如果未关闭 则电脑不会收到数据)

2.1PC端代码

使用UDP套接字,发送方不停的发东西就行了。

import socket
import cv2
import io
from PIL import Image
import numpy as np

s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM,0)#创建UDP的套接字

s.bind(("0.0.0.0",9090))whileTrue:#0.0.0.0:任意IP地址来源;使用相同端口9090

    data, IP = s.recvfrom(100000)#接收数据
    bytes_stream = io.BytesIO(data)

#显示图片、视频(若未接收到数据,窗口不会出现)
    image = Image.open(bytes_stream)
    img = np.asarray(image)
    img = cv2.cvtColor(img, cv2.COLOR_RGB2BGR)# ESP32采集的是RGB格式,要转换为BGR(opencv的格式)

    cv2.imshow("ESP32 Capture Image", img)

    if cv2.waitKey(1)==ord("q"):
        break#按q退出

2.2ESP32-CAM端代码

电脑IP:在cmd中输入if

import socket
import network
import camera
import time


# 连接wifi
wlan = network.WLAN(network.STA_IF)
wlan.active(True)
if not wlan.isconnected():#联网
    print('connecting to network...')
    wlan.connect('dongfeiqiu', 'wangmingdong1225')#wifi名字、密码
    
    while not wlan.isconnected():
        pass
print('网络配置:', wlan.ifconfig())
 
 
# 摄像头初始化
try:
    camera.init(0, format=camera.JPEG)
except Exception as e:
    camera.deinit()
    camera.init(0, format=camera.JPEG)


# 其他设置:
# 上翻下翻
camera.flip(0)
#左/右
camera.mirror(1)

# 分辨率
camera.framesize(camera.FRAME_HVGA)
# 选项如下:
# FRAME_96X96 FRAME_QQVGA FRAME_QCIF FRAME_HQVGA FRAME_240X240
# FRAME_QVGA FRAME_CIF FRAME_HVGA FRAME_VGA FRAME_SVGA
# FRAME_XGA FRAME_HD FRAME_SXGA FRAME_UXGA FRAME_FHD
# FRAME_P_HD FRAME_P_3MP FRAME_QXGA FRAME_QHD FRAME_WQXGA
# FRAME_P_FHD FRAME_QSXGA
# 有关详细信息,请查看此链接:https://bit.ly/2YOzizz

# 特效
camera.speffect(camera.EFFECT_NONE)
#选项如下:
# 效果\无(默认)效果\负效果\ BW效果\红色效果\绿色效果\蓝色效果\复古效果
# EFFECT_NONE (default) EFFECT_NEG \EFFECT_BW\ EFFECT_RED\ EFFECT_GREEN\ EFFECT_BLUE\ EFFECT_RETRO

# 白平衡
camera.whitebalance(camera.WB_HOME)
#选项如下:
# WB_NONE (default) WB_SUNNY WB_CLOUDY WB_OFFICE WB_HOME

# 饱和
camera.saturation(0)
#-2,2(默认为0). -2灰度
# -2,2 (default 0). -2 grayscale 

# 亮度
camera.brightness(0)
#-2,2(默认为0). 2亮度
# -2,2 (default 0). 2 brightness

# 对比度
camera.contrast(0)
#-2,2(默认为0).2高对比度
#-2,2 (default 0). 2 highcontrast

# 质量
camera.quality(10)
#10-63数字越小质量越高

# socket UDP 的创建
s = socket.socket(socket.AF_INET,socket.SOCK_DGRAM,0)

try:
    while True:
        buf = camera.capture()  # 获取图像数据
        s.sendto(buf, ("192.168.31.53", 9090))  # 向服务器(电脑ip)发送图像数据
        time.sleep(0.1)
except:
    pass
finally:
    camera.deinit()

保存视频


python代码中如何如何嵌入ESP32 的代码 python获取esp32cam_Powered by 金山文档_03


#pc端运行
import socket
import cv2
import io
from PIL import Image
import numpy as np
import time

s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM, 0)
s.bind(("0.0.0.0", 9090))

# 设置视频的编码解码方式avi:创建一个视频对象
video_type = cv2.VideoWriter_fourcc(*'XVID')  # 视频存储的格式

# 保存的位置,以及编码解码方式,帧率(每秒多少图片),视频帧大小(图片大小:一定要对):建立一个视频实例
#视频名字为时间.avi
mp4_file = cv2.VideoWriter('%s.avi' % str(time.time()), video_type, 5, (480, 320))

while True:
    data, IP = s.recvfrom(100000)
    bytes_stream = io.BytesIO(data)
    image = Image.open(bytes_stream)
    img = np.asarray(image)
    img = cv2.cvtColor(img, cv2.COLOR_RGB2BGR)  # ESP32采集的是RGB格式,要转换为BGR(opencv的格式)
    cv2.imshow("ESP32 Capture Image", img)#显示图片、视频

    ret = mp4_file.write(img)#在视频文件中流式写入图片

    print(ret)
    if cv2.waitKey(1) == ord("q"):
        break

PC端界面更新

使用SD卡、闪光灯

1. 目的

插入SD卡,可以将要存储的数据存放到SD中

2. SD安装方式


python代码中如何如何嵌入ESP32 的代码 python获取esp32cam_学习_04


python代码中如何如何嵌入ESP32 的代码 python获取esp32cam_数据_05


3. 代码

import uos
from machine import SDCard


# 挂载sd卡到sd文件夹
try:
    uos.mount(SDCard(), "/sd")#挂载SD卡,并命名文件夹为/sd(也可以其他名字)指向sd卡
except Exception as ret:
    print("挂载失败...", ret)
else:
    print("挂载成功...")
    
#测试写入text文件
with open("/sd/test.txt", "w") as f:
    for i in range(1, 101):
        f.write(str(i)+"\n")

print("已经将1 2 3....100写入到sd卡中的text.txt文件")

说明

  • 上述代码可以将SD卡,挂载到一个叫做sd的文件夹
  • 为了测试挂载正常,程序在这个SD卡中创建一个test.txt文件,别写入测试数据

5.4闪光灯

闪光灯的引脚:pin4


python代码中如何如何嵌入ESP32 的代码 python获取esp32cam_python_06


from machine import Pin
import time

# ######################### 注意 ########################## 
#闪光灯很亮,不要用眼睛直视,注意保护眼睛
# #######################################################

led = Pin(4, Pin.OUT)
for i inrange(3):
    led.value(1)
    time.sleep(0.1)
    led.value(0)
    time.sleep(0.1)