TinyTimelapseCam - 基于 FireBeetle 2 ESP32-S3 的迷你延时相机

2023-08-126629
AI 快速预览详细 收起
这是一个基于 FireBeetle 2 ESP32-S3 的迷你延时相机项目。通过 Python 调用推流,可以轻松拍摄延时摄影。首先部署网络摄像头,然后使用 Python 脚本进行推流测试。如果测试成功,可以运行延时相机程序,设置拍摄张数和间隔时间,最终生成延时摄影视频。该项目适合初学者和进阶用户,能够记录云层飘动、斗转星移或城市人群等场景。


这是一个基于 FireBeetle 2 ESP32-S3 的迷你延时相机,你可以用它来拍摄白天的云层飘动、一整晚的斗转星移,也可以用来抓取城市街道上形形色色的人群。

(图片后期再补{:5_116:} ~)

部署网络摄像头

请参考 摄像头使用 章节进行部署,此处不赘述。

测试使用 Python 调用推流

# 调用 OpenCV 库
import cv2

# 定义摄像头地址
camera_url = "http://192.168.31.203:81/stream"

# 创建VideoCapture对象
cap = cv2.VideoCapture(camera_url)

# 检查摄像头是否成功打开
if not cap.isOpened():
    print("无法连接到摄像头。请检查摄像头地址或网络连接。")
    exit()

while True:
    # 读取帧
    ret, frame = cap.read()

    # 检查帧是否成功读取
    if not ret:
        print("无法获取帧。")
        break

    # 显示预览画面
    cv2.imshow('Camera Preview', frame)

    # 按下 'q' 键退出预览
    if cv2.waitKey(1) & 0xFF == ord('q'):
        break

# 释放资源
cap.release()
cv2.destroyAllWindows()

需要注意的是,推流的地址是在原 IP 的基础上,加上 :81/stream 后缀。你也可以在网页端显示的实时画面上点击右键,复制推流的地址。

延时相机

如果前面的推流测试成功,就可以尝试以下延时相机的程序了:

import cv2
import numpy as np
import time
import os

nframes = 500  # 拍摄多少张照片
interval = 0.00001  # 间隔时间(秒)

# 需要改为你的 ESP32 的 IP 地址
cap = cv2.VideoCapture('http://192.168.31.203:81/stream')

print("延时相机启动")
for i in range(nframes):
    # 捕获图像帧
    ret, img = cap.read()
    # 保存图像文件
    if img is None:
        print("无法获取图像")
    else:
        cv2.imwrite('temp_destination/photos/img_' +
                    str(i + 1000).zfill(4) + '.png', img)
    # 等待一段时间
    time.sleep(interval)
    print("照片编号:", i)

# 定义照片文件夹路径
photos_path = "temp_destination/photos/"
# 如果文件夹不存在,则创建文件夹
os.makedirs(photos_path, exist_ok=True)
# 获取照片文件名列表
photos = os.listdir(photos_path)
# 按名称对照片进行排序
photos.sort()
# 创建视频写入对象
video = cv2.VideoWriter("temp_destination/video.avi",
                        cv2.VideoWriter_fourcc(*"MJPG"), 100, (1280, 720))

# 遍历照片
for photo in photos:
    # 读取照片作为图像
    image = cv2.imread(photos_path + photo)
    # 调整图像大小以适应视频帧大小
    image = cv2.resize(image, (1280, 720))
    # 将图像写入视频
    video.write(image)

# 释放视频写入对象
video.release()
print("延时摄影视频生成完成")

运行程序后,你可以在 temp_destination 文件夹下找到生成的视频。你也可以修改 nframesinterval 参数,使延时相机可以适用于不同的拍摄场景。

疑难解答与建议

  • 网页端可以显示实时画面,但本地无法抓取推流:同一时间只能开一个推流,请尝试把网页关掉。
  • 如果你打算拍一整天的视频,可以把 Python 程序运行在低功耗的服务器或旧手机上,这样就不用一直开着电脑。

参考与致谢

创作许可协议

本项目采用 None(不开放任何权利,保留所有权利) 进行许可。

评论(2)
花生编程
花生编程
赞赞赞赞赞
花生编程
花生编程
厉害厉害
- 没有更多了 -