Jetson 14 延时摄影

来自Waveshare Wiki
跳转至: 导航搜索

延时摄影

本章教程基于上一章的教程,按照一定的时间间隔来从摄像头获取画面,并将其存储在 ugv_jetson 文件夹下的 /templates/pictures/ 文件夹内。

准备工作

由于产品开机默认会自动运行主程序,主程序会占用摄像头资源,这种情况下是不能使用本教程的,需要结束主程序或禁止主程序自动运行后再重新启动机器人。

这里需要注意的是,由于机器人主程序中使用了多线程且由 crontab 配置开机自动运行,所以常规的 sudo killall python 的方法通常是不起作用的,所以我们这里介绍禁用主程序自动运行的方法。

如果你已经禁用了机器人主程序的开机自动运行,则不需要执行下面的结束主程序章节。

结束主程序

1. 点击上方本页面选项卡旁边的 “+”号,会打开一个新的名为 Launcher 的选项卡。

2. 点击 Other 内的 Terminal,打开终端窗口。

3. 在终端窗口内输入 bash 后按回车。

4. 现在你可以使用 Bash Shell 来控制机器人了。

5. 输入命令: sudo killall -9 python


例程

以下代码块可以直接运行:

1. 选中下面的代码块

2. 按 Shift + Enter 运行代码块

3. 观看实时视频窗口

4. 按 STOP 关闭实时视频,释放摄像头资源

如果运行时不能看到摄像头实时画面

  • 需要点击上方的 Kernel - Shut down all kernels
  • 关闭本章节选项卡,再次打开
  • 点击 STOP 释放摄像头资源后重新运行代码块
  • 重启设备

注意事项

如果使用CSI摄像头则需要注释 frame = cv2.cvtColor(frame, cv2.COLOR_BGR2RGB) 这一句。

与上一章节的区别

你可以更改 time_intervel 的数值来更改拍照的间隔时间,单位为秒。你所拍摄的照片会被存储在/ugv_jetson/templates/pictures/文件夹内。

import cv2  # OpenCV 库,用于图像处理
import numpy as np
from IPython.display import display, Image  # 用于实时图像显示
import ipywidgets as widgets  # Stop 按钮
import threading  # 线程
import os, time  # 文件和时间功能


# ============================
# 拍照间隔(秒)
# ============================
time_intervel = 3   # 每 3 秒自动拍照一次

# ============================
# 图片保存路径(可修改)
# ============================
photo_path = '/home/jetson/ugv_jetson/static/'

# 如果路径不存在则创建
os.makedirs(photo_path, exist_ok=True)

# ============================
# 创建 Stop 按钮
# ============================
stopButton = widgets.ToggleButton(
    value=False,
    description='Stop',
    disabled=False,
    button_style='danger',
    tooltip='Stop Video & Capture',
    icon='stop'
)


# ============================
# 摄像头显示 + 自动拍照线程函数
# ============================
def view(button):

    # 记录上一次拍照时间
    last_picture_time = time.time()
    num_count = 0

    # ============================
    # 打开摄像头(USB / UVC 摄像头一般是 0)
    # ============================
    camera = cv2.VideoCapture(0)

    # 设置分辨率
    camera.set(cv2.CAP_PROP_FRAME_WIDTH, 640)
    camera.set(cv2.CAP_PROP_FRAME_HEIGHT, 480)

    # 创建显示句柄(用于更新图像)
    display_handle = display(None, display_id=True)

    # ============================
    # 摄像头循环
    # ============================
    while True:

        # 如果按下 Stop 按钮,则退出
        if stopButton.value:
            camera.release()              # 正确关闭摄像头
            display_handle.update(Image(data=b""))  # 清空显示
            print("Camera stopped.")
            break  # 跳出循环,结束线程

        # 读取一帧图像
        ret, frame = camera.read()
        if not ret:
            continue  # 摄像头未返回画面则跳过

        # ============================
        # 自动拍照功能
        # ============================
        if time.time() - last_picture_time >= time_intervel:
            num_count += 1
            photo_filename = os.path.join(photo_path, f'photo_{num_count}.jpg')

            cv2.imwrite(photo_filename, frame)
            last_picture_time = time.time()

            print(f'{num_count} photos saved. new photo: {photo_filename}')

        # ============================
        # Jupyter Notebook 中显示摄像头画面
        # ============================
        _, jpeg = cv2.imencode('.jpeg', frame)
        display_handle.update(Image(data=jpeg.tobytes()))

        time.sleep(0.03)  # 小延时降低 CPU 占用



# ============================
# 启动线程
# ============================
display(stopButton)
thread = threading.Thread(target=view, args=(stopButton,))
thread.daemon = True
thread.start()