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()