You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

树莓派摄像头实现带Lower Third叠加层的Webcam及图像动态更新需求

Solution for Updating Pi Camera Lower Third Overlay Without Restarting Script

Hey Dan, no worries—let's tweak your script so you can update the overlay image on the fly, either on a timed schedule or when you modify the image file. Here's how to do both options:

Core Idea

The PiCamera overlay can't be edited directly once created, so we'll:

  1. Build a reusable function to load the image, prepare it for the overlay, and add it to the camera
  2. Remove the old overlay before adding a new one whenever we need to update
  3. Choose either a timed refresh or file-change trigger to run this update logic

Option 1: Timed Refresh (Every X Seconds)

This version checks for a new image every few seconds (adjust the REFRESH_INTERVAL to your needs):

import picamera
from PIL import Image
from time import sleep

# Set how often to check for updates (in seconds)
REFRESH_INTERVAL = 5

def update_overlay(camera, overlay=None):
    # Remove the old overlay if it exists
    if overlay is not None:
        camera.remove_overlay(overlay)
    
    # Load the latest image (with fallback if file is missing)
    try:
        img = Image.open('lol.gif')
    except FileNotFoundError:
        print("Image file not found—using empty overlay")
        img = Image.new('RGBA', (100, 50))  # Fallback empty placeholder
    
    # Prepare image for PiCamera overlay (required dimensions: width multiple of 32, height multiple of 16)
    pad = Image.new('RGBA', (
        ((img.size[0] + 31) // 32) * 32,
        ((img.size[1] + 15) // 16) * 16,
    ))
    pad.paste(img, (0, 0), img)
    
    # Add the new overlay with your original settings
    new_overlay = camera.add_overlay(pad.tostring(), size=img.size)
    new_overlay.alpha = 255
    new_overlay.layer = 3
    return new_overlay

with picamera.PiCamera() as camera:
    camera.start_preview()
    current_overlay = update_overlay(camera)  # Load initial overlay
    
    try:
        while True:
            sleep(REFRESH_INTERVAL)
            current_overlay = update_overlay(camera, current_overlay)  # Refresh overlay
            print("Overlay updated!")
    except KeyboardInterrupt:
        # Clean up gracefully when you press Ctrl+C
        camera.remove_overlay(current_overlay)
        camera.stop_preview()

Key Notes:

  • The update_overlay function handles all the heavy lifting: loading the image, formatting it for the camera, and managing overlays
  • We added a fallback empty image to avoid crashes if the file is missing during a refresh
  • Press Ctrl+C to stop the script cleanly

Option 2: Refresh When the Image File Changes

This version uses the watchdog library to automatically update the overlay as soon as you modify or replace lol.gif:

Step 1: Install the watchdog library

Run this in your terminal first:

pip install watchdog

Step 2: The Script

import picamera
from PIL import Image
from watchdog.observers import Observer
from watchdog.events import FileSystemEventHandler
import time

class ImageChangeHandler(FileSystemEventHandler):
    def __init__(self, camera, overlay):
        self.camera = camera
        self.overlay = overlay
    
    def on_modified(self, event):
        # Only react to changes in our target image file
        if event.src_path.endswith('lol.gif'):
            print("Image updated—refreshing overlay...")
            self.overlay = update_overlay(self.camera, self.overlay)

def update_overlay(camera, overlay=None):
    # Same reusable function as Option 1
    if overlay is not None:
        camera.remove_overlay(overlay)
    
    try:
        img = Image.open('lol.gif')
    except FileNotFoundError:
        print("Image file not found—using empty overlay")
        img = Image.new('RGBA', (100, 50))
    
    pad = Image.new('RGBA', (
        ((img.size[0] + 31) // 32) * 32,
        ((img.size[1] + 15) // 16) * 16,
    ))
    pad.paste(img, (0, 0), img)
    
    new_overlay = camera.add_overlay(pad.tostring(), size=img.size)
    new_overlay.alpha = 255
    new_overlay.layer = 3
    return new_overlay

with picamera.PiCamera() as camera:
    camera.start_preview()
    current_overlay = update_overlay(camera)
    
    # Set up the file change observer
    event_handler = ImageChangeHandler(camera, current_overlay)
    observer = Observer()
    observer.schedule(event_handler, path='.', recursive=False)
    observer.start()
    
    try:
        while True:
            time.sleep(1)
    except KeyboardInterrupt:
        observer.stop()
        camera.remove_overlay(current_overlay)
        camera.stop_preview()
    observer.join()

Key Notes:

  • The ImageChangeHandler watches for any modifications to lol.gif
  • As soon as you save a new version of the image (e.g., edit and export it), the overlay updates instantly
  • No need to wait for a timed interval—changes show up right away

Quick Tips for Your Video Conference Use Case

  • Use a transparent PNG/GIF for your lower third so it sits cleanly on top of the camera feed without blocking the background
  • Adjust new_overlay.layer if you need to reorder overlays (higher numbers mean the overlay appears on top of others)
  • Test with a small image first to position it exactly where you want on the frame

内容的提问来源于stack exchange,提问作者Dan Berlyoung

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.09 09:07:46